给定以下内容:
// 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;
可以编译通过的代码。
给定以下内容:
// 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;
可以编译通过的代码。
当我们设计这个功能时,我向社区询问了什么
var x = 1, y = 1.2;
这个问题是关于隐式类型声明的语义。问题和答案可以在以下链接找到:
简单来说,一半的回答认为将x和y都设为double是显然正确的,而另一半则认为将x设为int和y设为double是显然正确的。
(语言委员会指定了应该使用"double",并且我实际上在正式发布之前就已经以这种方式实现了代码。我们使用与隐式类型数组相同的类型推断算法,其中所有表达式必须可转换为最佳元素类型。)
当你的一半客户认为一件事情是“显然正确”的,而另一半认为相反的事情是“显然正确”的时候,你就有一个很大的设计问题了。解决方案是将整个过程设置为非法,并避免这个问题。
这只是程序员和编译器可能混淆的另一点。
例如,这个是可以的:
double i = 2, j = 3.4;
但这是什么意思呢?
var i = 2, j = 3.4;
使用语法糖的话,这种无人需要的麻烦事会让人头痛--因此我怀疑你所说的情况永远不会得到支持。它涉及编译器试图变得过于聪明而导致的太多复杂性。
i
和j
是double
,而其他人可能会期望i
为int
且j
为double
,还有一些情况下则是编译错误!不过,他们共同的反应是讨厌编译器设计者做错了事情。 - Jaroslav Jandek因为如果这个可以工作:
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 x = new object(), y = "Hello!", z = 5;
object
类型,因为它们唯一共同的类型就是object
。或者x
可以是object
类型,y
是string
类型,z
是int
类型吗?var
关键字通常应该让编译器为你推断出最具体的类型。var
语句。因此,var i=1,j=2
是有效的,var i=1.0,j=2
则不是。但我同意JamesGaunt的看法,这可能不值得规范、编码、测试的成本。 - CodesInChaosobject
。我认为Keith(和我)认为你只是想让编译器为所有变量选择最具体的公共类型。 - Dan Tao我认为这是因为编译器可能认为以下代码是相同的:
var i = 2, j = "three"
然而这两个变量肯定不是同一种类型。
int
的位置使用var
时,我总是感到很烦。它们的字母数量相同!在我看来,int
甚至更容易输入 ;) - Dan Tao