Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在try-catch块之外使用var-variable_C#_Linq_Var - Fatal编程技术网

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

C# 如何在try-catch块之外使用var-variable,c#,linq,var,C#,Linq,Var,我在try/catch中有一个var结果。我想使用try/catch块之外的结果,但是我不能在try块之前声明,因为var在运行时获取类型。我能做吗 public long getConfigVal<T>( int key, ref T sResult) { var myValue; try { myValue = (from el in keyValueList

我在try/catch中有一个var结果。我想使用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?

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

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

i、 e


例如:

它与try/catch无关,您必须在定义var的地方初始化var的用法。他们从作业的右边部分推断类型-他们仍然是类型。var-myInt=1;仍然被类型化为整数,您只需让编译器从文本1推断。在C语言中,隐式类型无法完成您要做的事情


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

您还可以使用动态变量:

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

        }
    }

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

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

}

我认为您不需要声明var myValue

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

转换为泛型类型比将变量声明为动态类型更容易,至少更节省

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

你是说el.Value是匿名类型的?它可以是:int、string或datetimewhat?它可能是动态的吗?对象不存在int、string或DateTime.worksss、Evk等类型,也许你想回答,所以我会接受这个答案?myValue不总是字符串吗?必须是,否则无法将其传递给解析方法。T可能会改变,但myValue的编译时类型不会改变。T只是用于int,不是吗?这是一个更糟糕的选项,动态和var是非常不同的事情。因为var在运行时需要一个数据类型,所以动态将是模拟var的数据类型的最有效方法。在本文所示的代码中,在运行时没有计算类型。将“car”替换为“dynamic”与使用“object”一样是一个糟糕的建议。@DaanV var是一个固定类型,在运行时不存在,它与声明一个正确类型的变量相同,但没有明确命名它,并且它仍然是类型安全的。唯一的实际效果是对开发人员隐藏真正的类型。另一方面,dynamic使所有内容都在运行时进行计算,因此您将失去类型安全性,并使所有内容都变慢。你甚至在使用它的时候失去了智能。实际上这不是一个答案,我只是想弄清楚是什么类型的EL…值。如果你不喜欢像“Bar”那样的强类型值,考虑切换到像JavaScript之类的其他语言。将“var”更改为“object”不是一个好建议,请不要这样做。将“var”更改为“object”不是一个好建议-为什么?@user1012506因为使用object是泛型的老方法。现在有很多省钱的方法。
 string myValue;
try
{                    
    myValue = from el in keyValueList select el.Value;
}
catch (Exception ex)
{

}