代码之家  ›  专栏  ›  技术社区  ›  Ed Guiness

隐式类型;为什么只是局部变量?

  •  21
  • Ed Guiness  · 技术社区  · 15 年前

    有人知道或愿意推测为什么隐式类型仅限于局部变量吗?

    var thingy = new Foo();
    

    但是为什么不…

    var getFoo() {
        return new Foo(); 
    }
    
    6 回复  |  直到 14 年前
        1
  •  41
  •   JaredPar    15 年前

    埃里克·利珀特就这个问题写了一篇博文。

    总的来说,主要问题是需要对C编译器进行重大的重新架构。声明当前以单传递方式处理。这需要多次通过,因为能够在推断变量之间形成循环。vb.net有大致相同的问题。

        2
  •  7
  •   Sam Saffron James Allen    15 年前

    贾里德的答案与一个奇妙的话题有着奇妙的联系。

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

    为什么不呢?

    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这样的动态语言使用。

        3
  •  1
  •   Marko    15 年前

    因为这样做容易多了。如果你要推理所有类型,你需要一个类似辛德利·米尔纳类型推理系统的东西,它将使你心爱的C成为哈斯克尔派生语言。

        4
  •  1
  •   Brian Genisio    15 年前

    本质上,您遇到的问题是C(迄今为止)是一种静态类型语言。定义为var的局部变量仍然是静态类型,但在语法上是隐藏的。另一方面,返回var的方法具有许多含义。它变得更像是一个可供使用的接口,并且您不会通过使用var获得任何东西。

        5
  •  1
  •   Oliver    14 年前

    您可以在vs 2010中使用 动态的

    Dynamic getFoo() { 
        return new Foo();  
    } 
    
        6
  •  0
  •   Garry Shutler    15 年前

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