【问题标题】:How to use var - variable outside of try-catch block如何在 try-catch 块之外使用 var - 变量
【发布时间】:2018-08-27 06:00:48
【问题描述】:

我有一个var 结果为try/catch。我想使用try/catch 块之外的结果,但我不能在try 块之前声明,因为var 在运行时获取类型。可以吗?

public long getConfigVal<T>( int key, ref T sResult)
  {
        var myValue;
        try
        {                    
            myValue = (from el in keyValueList 
       select (string)el.Attribute("value").Value).FirstOrDefault();
        }
        catch (Exception ex)
        {

        }
    if (sResult is string)
                        sResult = (T)(object)myValue;
                    if (sResult is int)
                        sResult = (T)(object)int.Parse(myValue);
                    if (sResult is DateTime)
                        sResult = (T)(object)DateTime.Parse(myValue); 
}

或者有什么方法可以在块外使用myValue

【问题讨论】:

  • 你的意思是el.Value是匿名类型的?
  • 可以是:int、string或dateTime
  • 怎么样?是dynamic 吗? object?没有“int、string 或 DateTime”这样的类型。
  • 作品,Evk! , 也许你想回答,所以我会接受这个答案?
  • myValue总是不是string吗?它必须是,否则您无法将其传递给 Parse 方法。 T 可能会改变,但myValue 的编译时间类型不会

标签: c# linq var


【解决方案1】:

不,您不能声明接收者类型为 var 的变量,然后决定不内联初始化它。

假设 select el.Value 不返回匿名类型,您需要使用显式类型变量。

IEnumerable<int> myValue;

例如:

【讨论】:

  • 它只是用于int,不是吗?
【解决方案2】:

它与try/catch 无关,您必须在定义它们的地方初始化var 的用法。他们推断从分配的右手部分的类型 - 他们仍然被键入。 var myInt = 1; 仍然是一个整数,你只需让编译器从文字 1 中推断出来。使用隐式类型无法在 C# 中完成您尝试做的事情。

'...因为 var 在运行时获取类型。' - 不,这一切都在编译时。您只需要声明变量的类型。

【讨论】:

    【解决方案3】:

    我认为您不需要声明 var myValue。

    你有一个泛型方法,所以你需要 T 作为 resultType。为什么不用这个?

    与将 var 声明为动态类型相比,强制转换为泛型类型更容易或至少更节省。

    而且这个答案可能不包含代码,但是寻找一种将字符串转换为值类型的扩展方法......或者字符串并不是获得保存解决方案的很大努力。 ;-)

    【讨论】:

      【解决方案4】:

      感谢 Evk 的好答案(但在 cmets...) 我将 myValue 声明为一个对象:

       string myValue;
      try
      {                    
          myValue = from el in keyValueList select el.Value;
      }
      catch (Exception ex)
      {
      
      }
      

      【讨论】:

      • 其实这不是一个答案,我只是想弄清楚el.Value的类型是什么...
      • 如果你不喜欢强类型值(比如“bar”提供的值),请考虑切换到其他语言,如 JavaScript。将“var”改为“object”不是一个好的建议,请不要这样做。
      • 将“var”改为“object”不是一个好的建议——为什么?
      • @user1012506 因为使用对象是泛型的旧方法。现在有(类型)保护方法。
      【解决方案5】:

      你也可以使用动态变量:

      dynamic _myvalue;
          public MainWindow()
          {
              try
              {
                var myValue =
                      from el in keyValueList
                      select el.Value;
                  _myvalue = myValue;
              }
              catch (Exception ex)
              {
      
              }
          }
      

      【讨论】:

      • 这是一个更糟糕的选择,dynamicvar非常不同的东西。
      • 由于 var 在运行时需要数据类型,动态将是模仿 var 数据类型的最有效方式
      • 博文显示的代码在运行时没有计算类型。将“汽车”替换为“动态”与使用“对象”一样糟糕。
      • @DaanV var 是一个 fixed 类型,在运行时不存在,这与声明一个正确类型的变量而不显式命名它是一样的,并且它仍然是类型安全的。唯一的实际效果是使开发人员无法看到真实类型。另一方面,dynamic 使所有内容都在运行时进行计算,因此您失去了类型安全性并使一切变得更慢。使用它时你甚至会失去智能。
      猜你喜欢
      • 2013-02-08
      • 2021-11-25
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多