我在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
?
答案 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);