代码之家  ›  专栏  ›  技术社区  ›  user1012506

如何在try-catch块之外使用var变量

  •  -2
  • user1012506  · 技术社区  · 8 年前

    我有一个 var 导致 try/catch . 我想使用 尝试/捕捉 块,但我不能在 try 阻止,因为 风险值 获取运行时的类型。我能做到吗?

    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 在街区外?

    5 回复  |  直到 8 年前
        1
  •  4
  •   Ousmane D.    8 年前

    否,不能声明接收器类型为的变量 var 然后决定不进行内联初始化。

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

    i、 e。

    IEnumerable<int> myValue;
    

    例如:

        2
  •  3
  •   thisextendsthat    8 年前

    这和 try/catch ,您必须初始化的用法 var 定义它们的位置。他们 推断 作业右侧的类型-它们仍然是键入的。 var myInt = 1; 仍然被类型化为整数,您只需让编译器根据文本推断 1 . 在C#中,使用隐式键入无法完成您要做的事情。

    '。。。因为var在运行时获取类型。“-不,都是在编译时完成的。您只需要声明变量的类型。

        3
  •  0
  •   Nikolaus    8 年前

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

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

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

    这个答案可能不包含代码,但正在寻找将字符串转换为值类型的扩展方法。。。,或者字符串并没有那么大的工作量来获得保存解决方案。 ;-)

        4
  •  0
  •   user1012506    8 年前

    感谢Evk给出的好答案(但在评论中…) 我将myValue声明为对象:

     string myValue;
    try
    {                    
        myValue = from el in keyValueList select el.Value;
    }
    catch (Exception ex)
    {
    
    }
    
        5
  •  -4
  •   DaanV    8 年前

    还可以使用动态变量:

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