鉴于以下内容:
// 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;
将编译。
答案 0 :(得分:59)
当我们设计这个功能时,我向社区询问了什么
var x = 1, y = 1.2;
应该意味着。问题和答案在这里:
简而言之,大约一半的回复者表示明显正确的做法是让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
,因为这是他们共同拥有的唯一类型吗?或者x
应object
,y
为string
,z
为int
?
一方面,您可能会想到前者,因为以这种方式声明的变量(全部在一行上)通常被认为都是相同的类型。另一方面,也许您认为它是后者,因为var
关键字通常应该让编译器为您推断出最具体的类型。
最好只是完全禁止这一点,而不是麻烦地确定它应该如何表现,因为它不会完全是一个“杀手”功能。
这是我的意见/猜测,至少。
答案 4 :(得分:1)
我认为,这是因为编译器可能与:
相同 var i = 2, j = "three"
那些肯定不是同一类型。