English 中文(简体)
隐式类型;为什么只是局部变量?
原标题:
  • 时间:2009-05-05 12:59:14
  •  标签:

有人知道或关心猜测为什么隐式类型仅限于局部变量?

var thingy = new Foo();

但是为什么不……

var getFoo() {
    return new Foo(); 
}
最佳回答

Eric Lippert做整个博客的主题。

总之,主要的问题在于,它需要一个主要已c#编译器。声明目前单通道的方式处理。这将需要多个通行证,因为推断变量之间形成周期的能力。VB。净有大致相同的问题。

问题回答

杰瑞德有一个很好的链接在他的回答,一个奇妙的话题。

我认为它不显式地回答这个问题。

为什么不呢?

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

因为它是更容易做。如果你推断所有类型,需要像辛德雷米尔纳类型推断系统将让你心爱的c#到Haskel导数的语言。

本质上,你遇到的问题是,c#(到目前为止)是一种静态类型语言。一个局部变量定义为var仍然是静态类型的,但语法隐藏。一个方法返回var,另一方面,有很多意义。变得更像一个接口来使用,你不获得任何通过使用var。

您可以使用在vs 2010动态

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

我认为这年代因为隐含类型的范围更广泛,因此更有可能引起的问题比范围内的一个方法。





相关问题
热门标签