隐式输入;为什么只是局部变量?
-
05-07-2019 - |
题
有谁知道或关心推测为什么隐式类型仅限于局部变量?
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#编译器不是以这种方式工作的。在推断类型可以运行的代码之前,它需要在过程的早期阶段使用方法和字段类型。
在纯粹的美学层面上,我发现方法上的var定义会混淆事物。它的一个地方,我认为明确始终有帮助,它可以保护您不会因为意外返回导致您的签名和大量其他依赖方法签名的类型而在脚中射击。最糟糕的是,如果你返回返回对象的方法的值并且碰巧是幸运的话,你甚至可能会改变方法链的所有签名,甚至不知道你这样做了。
我认为var方法最适合像Ruby这样的动态语言
因为这样做更容易。如果你要推断所有类型,就需要像Hindley Milner类型推理系统那样将你心爱的C#变成Haskel衍生语言。
基本上,您遇到的问题是C#(到目前为止)是一种静态类型语言。定义为var的局部变量仍然是静态类型的,但在语法上是隐藏的。另一方面,返回var的方法有许多含义。它变得更像是一个使用界面,你不会通过使用var。
获得任何东西您可以在vs 2010中使用动态
Dynamic getFoo() {
return new Foo();
}
我认为这是因为隐含类型的范围要宽得多,因此比单一方法的范围更容易引起问题。