隐式input; 为什么只是局部variables?

有谁知道或关心推测为什么隐式打字局限于局部variables?

var thingy = new Foo(); 

但为什么不…

 var getFoo() { return new Foo(); } 

Eric Lippert在这个问题上做了一个完整的博客文章。

总而言之,主要的问题在于,它需要C#编译器的一个重要的重新架构才能这样做。 声明目前以单通方式处理。 由于能够在推断的variables之间形成循环,所以这将需要多次通过。 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 ,但是你将不得不追踪所有的方法所做的调用,并且它的 GetFoo只是为了推断这个types。 就目前而言,C#编译器并不是以这种方式工作的。 在推断types的代码可以运行之前,它在stream程的早期需要方法和字段types。

在纯粹的美学层面上,我发现方法上的var定义混淆了事物。 它的一个地方,我认为是明确的总是有帮助的,它可以防止你在自己的脚上意外地返回一个导致你的签名和大量其他依赖方法签名的types。 最糟糕的是,如果你返回一个返回对象的方法的值,而且碰巧是幸运的,你甚至可能会改变一个方法链的所有签名。

我认为var方法最好留给像Ruby这样的dynamic语言

因为这样做很容易。 如果你要推断所有types,就需要一些类似于Hindley Milnertypes的推理系统,这将使你心爱的C#成为Haskel派生语言。

从本质上讲,你遇到的问题是,C#(迄今为止)是一种静态types的语言。 定义为var的局部variables仍然是静态types的,但在语法上隐藏。 另一方面,返回var的方法有很多含义。 它变成了更多的使用接口,你不会通过使用var获得任何东西。

您可以在vs 2010 Dynamic中使用

 Dynamic getFoo() { return new Foo(); } 

我认为这是因为这种隐含types的范围比单一方法的范围更广泛,因此更可能导致问题。