C# 如何在try-catch块之外使用var-variable
我在try/catch中有一个var结果。我想使用try/catch块之外的结果,但是我不能在try块之前声明,因为var在运行时获取类型。我能做吗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
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)
{
}