为什么不能用VAR返回类型声明一个函数?

时间:2010-11-09 09:46:27

标签: function c#-4.0 dynamic-data return-value return-type

在C#中,我们有var数据类型,但我们不能将它用作函数返回类型 为什么这不可能?

public var myFunction()
{
    var = some operations
}

2 个答案:

答案 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
}