有人知道或者愿意推测为什么隐式类型声明只限于局部变量吗?
var thingy = new Foo();
但为什么不呢?...
var getFoo() {
return new Foo();
}
有人知道或者愿意推测为什么隐式类型声明只限于局部变量吗?
var thingy = new Foo();
但为什么不呢?...
var getFoo() {
return new Foo();
}
Eric Lippert在他的博客上详细探讨了这个问题。
总结来说,主要问题是这将需要对C#编译器进行重大的重新架构。声明目前是以单一通道方式处理的。因为可以形成推断变量之间的循环,所以这将需要多次通行。VB.NET也面临着类似的问题。
Jared在他的回答中提供了一个很棒的链接,涉及到一个很棒的话题。
我认为它没有明确回答问题。
为什么呢?
var getFoo() {
return new Foo();
}
class Foo {}
var GetFoo() {
return GetBar();
}
var GetBar() {
return GetBaz();
}
var GetBaz() {
return new Foo();
}
GetFoo
将返回Foo
,但你必须跟踪该方法所做的所有调用及其子调用,才能推断出类型。就目前而言,C#编译器并不是以这种方式设计的。在代码推断类型运行之前,它需要早期的方法和字段类型。你可以在 VS 2010 中使用动态
Dynamic getFoo() {
return new Foo();
}
dynamic
和 var
不同。var
在编译时推断类型,而 dynamic
根据分配的内容在运行时进行类型定义。 - bazzilic因为这样做要简单得多。如果您要进行所有类型的推断,那么需要类似 Hindley Milner 类型推断系统的东西,这将使您所钟爱的 C# 成为 Haskel 衍生语言。
实际上,你遇到的问题是C#(目前)是一种静态类型语言。定义为var的局部变量仍然是静态类型,但在语法上被隐藏了。另一方面,返回var的方法有许多含义。它变得更像一个用法接口,使用var并没有任何好处。
我认为这是因为隐含类型的范围更广,因此比单个方法的范围更容易引起问题。