e.g。
public var SomeMethod()
{
return "hello";
}
错误:
上下文关键字var
可能只出现在本地变量声明
由于
答案 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
?
只有在运行时才能在int
和string
之间解析正确的类型。
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#语言中寻找的是允许通过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