49

鉴于以下情况:

// 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;

哪个会编译。

4

5 回答 5

61

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

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

(语言委员会规定它应该是“double”,实际上我在发布之前很久就以这种方式实现了代码。我们使用与隐式类型数组相同的类型推断算法,其中所有表达式都必须转换为最佳元素类型。)

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

于 2011-02-09T21:22:18.140 回答
44

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

例如这很好:

double i = 2, j = 3.4;

但是,这是什么意思?

var i = 2, j = 3.4;

使用语法糖,这种事情是一件令人头疼的事情,没有人需要——所以我怀疑你的案例是否会得到支持。它涉及太多的编译器试图变得有点过于聪明。

于 2011-02-09T20:36:52.000 回答
7

因为如果这有效:

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。

于 2011-02-09T20:43:16.740 回答
4

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

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

是否应该将它们都输入为object,因为这是它们共同的唯一类型?或者应该xobjectystringzint

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

最好完全禁止这一点,而不是费心弄清楚它应该如何表现,因为它无论如何都不会完全是一个“杀手”功能。

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

于 2011-02-09T20:39:56.020 回答
1

我认为,那是因为对于编译器,它可能与以下内容相同:

var i = 2, j = "three"

而那些肯定不是同一类型。

于 2011-02-09T20:37:27.130 回答