为什么C#不允许使用var声明多个变量?

aar*_*ona 46 c# declaration implicit-typing variable-declaration

鉴于以下内容:

// not a problem
int i = 2, j = 3;
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶:

// compiler error: Implicitly-typed local variables cannot have multiple declarators
var i = 2, j = 3;
Run Code Online (Sandbox Code Playgroud)

不编译.也许有一些我不明白的事情(这就是我问这个的原因)?

但为什么编译器不会意识到我的意思:

var i = 2;
var j = 3;
Run Code Online (Sandbox Code Playgroud)

哪个会编译.

Eri*_*ert 59

当我们设计这个功能时,我向社区询问了什么

var x = 1, y = 1.2;
Run Code Online (Sandbox Code Playgroud)

应该意味着.问答在这里:

http://blogs.msdn.com/b/ericlippert/archive/2006/06/26/what-are-the-semantics-of-multiple-implicitly-typed-declarations-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2006/06/27/what-are-the-semantics-of-multiple-implicitly-typed-declarations-part-two.aspx

简而言之,大约一半的回复者表示明显正确的做法是让x和y都加倍,大约一半的回复者说明显正确的做法是让x int和y加倍.

(语言委员会指出它应该是"双"的,我实际上在我们出货之前很久就实现了代码.我们使用与隐式类型数组相同的类型推理算法,其中所有表达式必须可转换为最佳元素类型.)

当你的一半客户认为一件事"显然是正确的"而另一半人认为相反的情况"显然是正确的"时,你手上就会遇到很大的设计问题.解决方案是使整件事非法并避免问题.

  • @Marlon:首先,你对C的直觉是错误的,因为你编写声明的方式."int*x,y;" 表达了真正的含义,即*x和y都是包含int的变量.其次,你必须考虑另一种语言的(奇怪的)语义,以及你在整个过程中改变主意的事实,更多的证据表明该特征完全不清楚和误导,因此应该被视为非法.这就是我们做的. (9认同)

Jam*_*unt 41

这只是程序员和编译器可能混淆的另一个问题.

例如,这很好:

double i = 2, j = 3.4;
Run Code Online (Sandbox Code Playgroud)

但是,这是什么意思?

var i = 2, j = 3.4;
Run Code Online (Sandbox Code Playgroud)

使用语法糖这种事情是一个无人问津的头疼 - 所以我怀疑你的情况会得到支持.它涉及太多的编译器试图有点太聪明.

  • 这个帖子的长度现在是问题的答案. (9认同)
  • 我已经看到了与语言作者的对话,的确如此:原因正是如此.由于没有*明确和明显的解释方式*每个人*同意(最少惊喜等),它更好*不*.有些人会认为*显然*是双倍和双倍,有些人会认为*显然*它是int和double ... (6认同)
  • 是的,但是编译器可以捕获多个类型的赋值,并且在这种情况下只会产生错误.看起来这只是一个设计选择.当然,可能有技术原因,我不知道. (4认同)
  • @Ed S.支持的任何内容都涉及设计,测试和支持的成本.由于此功能没有真正的好处,并且可能至少令某些人感到困惑和/或令人沮丧,我认为不需要做出排除它的积极决定.它不值得包含在C#功能集中.或引用星际迷航......"仅仅因为我们可以做一件事......" (3认同)
  • 编译器可以简单地使用其中一个场景并在第一遍中解决它.另一方面,**程序员**非常混乱**.C++程序员可能希望`i`和`j`是`double`,其他一些`i`是`int`和`j`是`double`和其他编译错误!他们都有什么共同点,他们会讨厌编译器设计师做错了. (3认同)
  • @Pedro:因为在C#中有效的任何其他以逗号分隔的声明变量列表必须具有相同的类型.所以,你在那里引入混乱; 在这样一个列表的开头用`var`替换`double`会突然改变很多变量类型.此外,如果您将鼠标悬停在任何现有的`var`上,您将获得当前推断的类型.想象一下,将鼠标放在`var x = 1,y ="foo"`中的`var`上.这令人困惑. (3认同)
  • 总是让我感到沮丧的是+意味着增加而不是减去.我讨厌那个. (2认同)

Kei*_*thS 6

因为如果这有效:

var i = 2, j = 3;
Run Code Online (Sandbox Code Playgroud)

因为这有效:

var i = 2;
var j = 3;
Run Code Online (Sandbox Code Playgroud)

然后你可能会期望这个工作:

var i = 2, j = "3";
Run Code Online (Sandbox Code Playgroud)

因为这有效:

var i = 2;
var j = "3";
Run Code Online (Sandbox Code Playgroud)

即使在James Gaunt提出的情况下,它们都是数字类型,并且可以存储在相同类型的值中,将i是什么类型?:

var i = 2, j = 3.4;
Run Code Online (Sandbox Code Playgroud)

j显然是一个double,但i逻辑上可以是int或double,这取决于你如何期望var来推断类型.无论哪种方式实施,你都会与那些期望它以其他方式工作的人混淆.

为了避免所有这些混乱,它是完全不允许的.个人而言,我个人并不认为这是一个巨大的损失; 如果你想声明一个变量列表(这在我的工作经验中很少见),只需强烈输入em即可.