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

时间:2011-02-09 20:30:03

标签: c# declaration implicit-typing variable-declaration

鉴于以下内容:

// not a problem
int i = 2, j = 3;

所以这让我感到惊讶:

// compiler error: Implicitly-typed local variables cannot have multiple declarators
var i = 2, j = 3;

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

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

var i = 2;
var j = 3;

将编译。

5 个答案:

答案 0 :(得分:59)

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

var x = 1, y = 1.2;

应该意味着。问题和答案在这里:

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加倍。

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

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

答案 1 :(得分:38)

这只是程序员和编译器可能混淆的另一点。

例如,这很好:

double i = 2, j = 3.4;

但这是什么意思?

var i = 2, j = 3.4;

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

答案 2 :(得分:6)

因为如果这样做了:

var i = 2, j = 3;

因为这有效:

var i = 2;
var j = 3;

那么你可能希望这可行:

var i = 2, j = "3";

因为这有效:

var i = 2;
var j = "3";

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

var i = 2, j = 3.4;

j显然是一个double,但i在逻辑上可以是int或double,具体取决于你期望var推断类型的方式。无论哪种方式实施,你都会混淆那些期望它以另一种方式工作的人。

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

答案 3 :(得分:4)

我认为这太不确定了。当两个变量是相同类型时,这是一个简单的特定情况,但在更一般的情况下,您必须考虑代码中的“正确”,如:

var x = new object(), y = "Hello!", z = 5;

这些都应该输入为object,因为这是他们共同拥有的唯一类型吗?或者xobjectystringzint

一方面,您可能会想到前者,因为以这种方式声明的变量(全部在一行上)通常被认为都是相同的类型。另一方面,也许您认为它是后者,因为var关键字通常应该让编译器为您推断出最具体的类型。

最好只是完全禁止这一点,而不是麻烦地确定它应该如何表现,因为它不会完全是一个“杀手”功能。

这是我的意见/猜测,至少。

答案 4 :(得分:1)

我认为,这是因为编译器可能与:

相同

var i = 2, j = "three"

那些肯定不是同一类型。