为什么不允许使用 'var' 的复合定义?
Why are compound definitions using 'var' not allowed?
好吧,我真的认为这会起作用(在方法内部):
var x, y = 1;
var x = 1, y = 2;
但它没有,它不会编译 - "var is not allowed in a compound definition"。
我想这是一个通常的权衡取舍的原因。这不是一个非常常用的功能,因此没有实现,但我们可以,并且可能会在未来的版本中......
好吧,如果你给它一个清单类型:
int x, y = 1;
这声明了两个 int 变量,并初始化了其中一个。但是局部变量类型推断需要一个初始化器来推断类型。所以你已经死了。
但是,假设您打算为两者提供一个初始值设定项。 "obvious" 当两个初始值设定项具有相同类型时该怎么做。所以让我们让它变得更难。假设你说:
var x = 1, y = 2.0;
这是什么意思?这是否将 x
声明为 int
并将 y
声明为 float
?或者它是否试图找到某种可以同时是 x 和 y 类型的类型?无论我们决定采用哪种方式,有些人会认为它应该以另一种方式工作,这会从根本上造成混淆。
还有,有什么好处?与潜在的语义混淆相比,说出你的意思所增加的句法成本是微不足道的。这就是为什么我们将其排除在本地类型推断范围之外的原因。
你可能会说,那么,"well, only make it work if they are the same type." 我们可以做到这一点,但现在什么时候可以使用推理,什么时候不能使用推理的界限 甚至更加复杂 。无论如何,我现在都会回答相同类型的 "why don't you" 问题......现实是推理方案总是有局限性;您选择的是边界。最好选择干净、明确的限制 ("can use it in these contexts"),而不是模糊的限制。
好吧,我真的认为这会起作用(在方法内部):
var x, y = 1;
var x = 1, y = 2;
但它没有,它不会编译 - "var is not allowed in a compound definition"。
我想这是一个通常的权衡取舍的原因。这不是一个非常常用的功能,因此没有实现,但我们可以,并且可能会在未来的版本中......
好吧,如果你给它一个清单类型:
int x, y = 1;
这声明了两个 int 变量,并初始化了其中一个。但是局部变量类型推断需要一个初始化器来推断类型。所以你已经死了。
但是,假设您打算为两者提供一个初始值设定项。 "obvious" 当两个初始值设定项具有相同类型时该怎么做。所以让我们让它变得更难。假设你说:
var x = 1, y = 2.0;
这是什么意思?这是否将 x
声明为 int
并将 y
声明为 float
?或者它是否试图找到某种可以同时是 x 和 y 类型的类型?无论我们决定采用哪种方式,有些人会认为它应该以另一种方式工作,这会从根本上造成混淆。
还有,有什么好处?与潜在的语义混淆相比,说出你的意思所增加的句法成本是微不足道的。这就是为什么我们将其排除在本地类型推断范围之外的原因。
你可能会说,那么,"well, only make it work if they are the same type." 我们可以做到这一点,但现在什么时候可以使用推理,什么时候不能使用推理的界限 甚至更加复杂 。无论如何,我现在都会回答相同类型的 "why don't you" 问题......现实是推理方案总是有局限性;您选择的是边界。最好选择干净、明确的限制 ("can use it in these contexts"),而不是模糊的限制。