我们可以在这种情况下使用'var'

时间:2011-03-18 12:17:43

标签: c#

我们可以在函数中使用var两次。 e.g

var varname= sometype;
if(true)
{
    varname= type1;
}
else
{
   varname=type2;
}

如果这是不可能的,我会说这是var的限制。

7 个答案:

答案 0 :(得分:7)

那只是一次只使用var本身 - 但只要你有一个表达式来初始化它,就可以了。 (type1type2需要转换为sometype类型。)

无法做的是:

var x; // No initialization expression
if (condition)
{
    x = firstExpression;
}
else
{
    x = secondExpression;
}

是一个初始化表达式(不能是匿名函数或空文字)。如果你想要这种东西,你可以使用条件运算符:

var x = condition ? firstExpression : secondExpression;

答案 1 :(得分:1)

是的,您可以在此实例中使用var,但只有sometypetype1type2属于同一类型。

如果type1type2实际上是不同的类型,当且仅当varsometypetype1的超类时,您仍然可以使用type2 type1

如果您在编译时不知道type2dynamic是什么,则需要使用var而不是type1。如果您知道type2var都实现了相同的接口,请使用声明中的接口而不是{{1}}。

答案 2 :(得分:1)

内联作业将定义var的类型;如果type1type2sometype兼容,那将会有效,但第一项任务毫无意义。如果它是re​​f-type,你可以投一个null;这基本上是一个无操作:

var varname= (sometype)null;

但到那时,你也可以不使用任何作业:

sometype varname;

可以说更好的布局是

var name = condition ? expr1 : expr2;

请注意,如果没有明显相同的类型(可能它们是公共基类型的不同子类),您可能需要帮助它决定:

var name = condition ? (Foo)expr1 : expr2;

如果类型不相关,则不适合使用var;您可能会发现objectdynamic更合适。

答案 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找到一个不错的解释。