隐式打字;为什么只是局部变量?

时间:2009-05-05 12:59:15

标签: c# .net variables implicit-typing

有人知道或关心为什么隐式输入仅限于局部变量吗?

var thingy = new Foo();

但为什么不......

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

6 个答案:

答案 0 :(得分:41)

Eric Lippert撰写了关于这个主题的整篇博客文章。

总之,主要问题是它需要C#编译器的主要重新架构才能这样做。声明目前以单程方式处理。这将需要多次通过,因为能够在推断的变量之间形成循环。 VB.net有大致相同的问题。

答案 1 :(得分:7)

Jared在他的回答中有一个很棒的链接,一个很棒的主题。

我认为它没有明确回答这个问题。

为什么不呢?

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

原因是:

怎么办?

class Foo {}

var GetFoo() {
   return GetBar(); 
}

var GetBar() {
  return GetBaz(); 
}

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

您可以推断GetFoo将返回Foo,但您必须追踪所有方法所做的调用及其子项仅用于推断类型。目前,C#编译器不是以这种方式工作的。在推断类型可以运行的代码之前,它需要在过程的早期阶段使用方法和字段类型。

在纯粹的美学层面上,我发现方法上的var定义会混淆事物。它的一个地方,我认为明确总是有帮助,它可以保护你不会因为不小心返回导致你的签名和大量其他依赖方法签名的类型而在脚中射击。最糟糕的是,如果你返回返回对象的方法的值并且碰巧是幸运的话,你甚至可能会改变方法链的所有签名,甚至不知道你这样做了。

我认为var方法最适合像Ruby这样的动态语言

答案 2 :(得分:1)

因为这样做更容易。如果你要推断所有类型,那么就需要像Hindley Milner类型推理系统那样将你心爱的C#变成Haskel衍生语言。

答案 3 :(得分:1)

基本上,您遇到的问题是C#(到目前为止)是一种静态类型语言。定义为var的局部变量仍然是静态类型的,但在语法上是隐藏的。另一方面,返回var的方法有许多含义。它变得更像是一个使用界面,你不会通过使用var。

获得任何东西

答案 4 :(得分:1)

您可以在vs 2010中使用动态

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

答案 5 :(得分:0)

我认为这是因为隐含类型的范围要宽得多,因此比单一方法的范围更容易引起问题。