鉴于以下情况:
// 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 都加倍,大约一半的受访者表示明显正确的做法是将 x int 和 y 加倍。
(语言委员会规定它应该是“double”,实际上我在发布之前很久就以这种方式实现了代码。我们使用与隐式类型数组相同的类型推断算法,其中所有表达式都必须转换为最佳元素类型。)
当您的一半客户群认为一件事“显然正确”而另一半认为相反“显然正确”时,您手上的设计问题就大了。解决方案是使整个事情非法并避免问题。
这只是程序员和编译器可能混淆的另一个点。
例如这很好:
double i = 2, j = 3.4;
但是,这是什么意思?
var i = 2, j = 3.4;
使用语法糖,这种事情是一件令人头疼的事情,没有人需要——所以我怀疑你的案例是否会得到支持。它涉及太多的编译器试图变得有点过于聪明。
因为如果这有效:
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。
我觉得这太不靠谱了。当两个变量的类型相同时,这是一个简单的特定情况,但在更一般的情况下,您必须考虑代码中的“正确”,例如:
var x = new object(), y = "Hello!", z = 5;
是否应该将它们都输入为object
,因为这是它们共同的唯一类型?或者应该x
是object
、y
是string
和z
是int
?
一方面,您可能会认为是前者,因为以这种方式声明的变量(都在一行上)通常被假定为都是相同的类型。另一方面,您可能会认为是后者,因为var
关键字通常应该让编译器为您推断出最具体的类型。
最好完全禁止这一点,而不是费心弄清楚它应该如何表现,因为它无论如何都不会完全是一个“杀手”功能。
这是我的意见/猜测,至少。
我认为,那是因为对于编译器,它可能与以下内容相同:
var i = 2, j = "three"
而那些肯定不是同一类型。