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

时间:2018-03-18 16:10:11

标签: c# linq var

我在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

5 个答案:

答案 0 :(得分:4)

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

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

即。

IEnumerable<int> myValue;

例如:

答案 1 :(得分:3)

它与try/catch无关,您必须初始化您定义它们的var的用法。他们从作业的右手部分推断类型 - 它们仍然是键入的。 var myInt = 1;仍然输入一个整数,你只需让编译器从文字1中推断出来。你想要做的事情不能用C#进行隐式输入。

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

答案 2 :(得分:0)

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

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

}

答案 3 :(得分:0)

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

您有一个通用方法,因此需要T作为resultType。为什么不使用它?

转换为泛型类型比将var声明为动态类型更容易或至少更安全。

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

答案 4 :(得分:-3)

您还可以使用动态变量:

        var rootObject = JsonConvert.DeserializeObject<Rootobject>(jsonString);