函数返回类型不能变为var的原因是什么?

时间:2010-12-08 05:25:45

标签: c#-3.0

e.g。

public var SomeMethod()
{ 
   return "hello";
}

错误: 上下文关键字var可能只出现在本地变量声明

由于

3 个答案:

答案 0 :(得分:1)

C#仅支持局部变量的类型推断。它不支持非匿名函数的返回类型。这是一个设计决定。他们将来可能会改变它。像F#这样的语言实际上支持返回类型推断,因此这里没有涉及的固有不可能性。当然,有时,推断的返回类型可能含糊不清,需要在支持它的语言中进一步澄清:

// not real C#:
public var Method(bool returnInt) {
    if (returnInt) return 42; else return true;
}
// what's the return type of Method is going to be? ValueType? object? ...?

答案 1 :(得分:1)

我建议你阅读Why no var on fields?

  

在我最近提出的让你蠢蠢欲动的请求中,读者注意到你不能在字段上使用“var”。

现在您不希望将var用于字段,但您确实希望将其用于除指定方式之外的其他目的。该文章应该让您对围绕var特性的编译器实现有所了解(以及为什么var可能不是有效的返回类型)。

现在,正如所说的那样,返回表达式的类型推断出方法的返回类型是完全有效的。

答案 2 :(得分:0)

考虑一个可能含糊不清的情况,稍微改善一下你的问题:

public var SomeMethod()  { 
    return DateTime.Now.Second % 2 == 0 ? "hello" : 3;
}

编译器是否应该引发错误或推断类型System.Object? 只有在运行时才能在intstring之间解析正确的类型。


必须在初始化语句的左侧使用

var,因为其类型是由C#编译器从右侧的结果数据类型推断出来的。

var thing = 3;
// infers System.Int32 from right side.

var thing = 3L;
// infers System.Int64 from right side.

// This also applies to methods and things that have a defined type on the right side:
var thing = obj.AnyMethod(); 

如果可以使用var代替方法返回类型,那么C#编译器如何从方法内的所有逻辑中轻松推断出该类型?

var MyCall() { // ??? could be various things really
    // lots of logic...
}

可用的C#替代

但是,您可能在C#语言中寻找的是允许通过Type Parameter and Generics方法从您的方法中获得可互换的返回类型,如下所示:

T MyCall<T>() { 
    // lots of logic...

然后,调用者可以指定将返回的类型。例如:

一个int。

var result = MyCall<int>();
// var will infer System.Int32

一个字符串。

var result = MyCall<string>();
// var will infer System.String