在C#中,我们有var
数据类型,但我们不能将它用作函数返回类型
为什么这不可能?
public var myFunction()
{
var = some operations
}
答案 0 :(得分:13)
我认为这部分是由于编译器的设计。 Eric Lippert blogged关于为什么 fields 不能使用隐式类型,我怀疑某些相同的参数适用于方法。
但无论如何,你很容易就会产生歧义。例如:
var Method1(bool callMethod2)
{
return callMethod2 ? Method2() : null;
}
var Method2()
{
return Method1(false);
}
这里的类型应该是什么?
一个更简单的例子:
var Method1(bool throwException)
{
if (!throwException)
{
return Method1(true);
}
throw new Exception("Bang!");
}
不可否认,这种歧义可能是不允许的,但我怀疑设计团队认为设计和实施的复杂性增加并不值得。不要忘记他们在资源有限的情况下运行 - 在var
方法和async/await
之间做出选择,我会在心跳中选择后者。 (不可否认,我已经选择了其他功能而不是dynamic
,但这是另一回事......)
请注意,为lambda表达式执行返回类型推断 ,所以它的想法并不疯狂。例如:
IEnumerable<string> x = new[] { "x", "y", "z" };
var result = x.Select(s => { return s.Length; }); // Long form
当编译器在Select
上执行重载决策时,编译器会推断出lambda表达式的完整类型,并将其转换为Func<string, int>
。将相同的想法应用于方法并不是不可思议的 - 只是复杂的。
答案 1 :(得分:2)
var
不是C#中的数据类型。这就是为什么你不能将它用作返回参数。编译器在编译时从赋值的右侧推断出类型,并记住在编译时已知需要使用实数类型作为返回值。在C#4.0中,您可以使用dynamic类型:
public dynamic myFunction()
{
var = some operations
}