我们可以在函数中使用var两次。 e.g
var varname= sometype;
if(true)
{
varname= type1;
}
else
{
varname=type2;
}
如果这是不可能的,我会说这是var的限制。
答案 0 :(得分:7)
那只是一次只使用var
本身 - 但只要你有一个表达式来初始化它,就可以了。 (type1
和type2
需要转换为sometype
类型。)
无法做的是:
var x; // No initialization expression
if (condition)
{
x = firstExpression;
}
else
{
x = secondExpression;
}
有是一个初始化表达式(不能是匿名函数或空文字)。如果你想要这种东西,你可以使用条件运算符:
var x = condition ? firstExpression : secondExpression;
答案 1 :(得分:1)
是的,您可以在此实例中使用var
,但只有sometype
与type1
和type2
属于同一类型。
如果type1
和type2
实际上是不同的类型,当且仅当var
是sometype
和type1
的超类时,您仍然可以使用type2
type1
。
如果您在编译时不知道type2
和dynamic
是什么,则需要使用var
而不是type1
。如果您知道type2
和var
都实现了相同的接口,请使用声明中的接口而不是{{1}}。
答案 2 :(得分:1)
内联作业将定义var
的类型;如果type1
和type2
与sometype
兼容,那将会有效,但第一项任务毫无意义。如果它是ref-type,你可以投一个null
;这基本上是一个无操作:
var varname= (sometype)null;
但到那时,你也可以不使用任何作业:
sometype varname;
可以说更好的布局是
var name = condition ? expr1 : expr2;
请注意,如果没有明显相同的类型(可能它们是公共基类型的不同子类),您可能需要帮助它决定:
var name = condition ? (Foo)expr1 : expr2;
如果类型不相关,则不适合使用var
;您可能会发现object
或dynamic
更合适。
答案 3 :(得分:1)
你的例子令人困惑。您没有为变量分配类型,您可以分配值。如果您说var varname=3;
,那么varname
就是int
。然后,您被约束为仅将int(以及转换为int的值)分配给它,就像您说过int varname=3;
一样 - 没有区别。
答案 4 :(得分:0)
这是不可能的。 var
是类型安全的,这意味着它的类型将从赋值中推断出来。因此,在您的示例中,var
的类型为sometype。不可能为其分配不同的类型(只要它们之间不可能进行转换)。
使用object
代替var
将适用于此方案。
答案 5 :(得分:0)
只要您具有初始化语法,就可以实现。此外,最好将var用于引用类型,并为值类型使用类型
答案 6 :(得分:0)
C#中的var类型需要初始化为类型。该类型在编译时确定并执行。当编译器确定类型会有所不同时,它会给它一个匿名类型(参见http://msdn.microsoft.com/en-us/library/bb397696.aspx)。
匿名类型只能转换为对象类型。所以简短的答案是否定的,你不能使用var来引用多种类型。甚至可以包含各种类型的对象本身也是一种类型,并且赋予该类型的var不能更改为另一种类型。在这个意义上,var关键字允许您灵活但仍然强类型。
如果你有一个不同类型的项目数组,编译器会为var实现anon类型,它基本上可以作为一个对象。可以在http://msdn.microsoft.com/en-us/library/bb384061.aspx找到一个不错的解释。