C# 设计委员会是否考虑过这种对象创建语法?
是的我们有。几年前我们考虑过。作为这种说法的证据,请参阅我文章的最后一段:
http://blogs.msdn.com/b/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx
设计团队的共识是,这是一个“值得拥有”的功能,但还不够引人注目,以至于值得为设计、实施、测试、记录和维护该功能付出可观的成本。
我还注意到,我链接到的博客条目的评论对该功能非常负面;似乎很多人发现语法没有吸引力。这也是反对做这个功能的要点。
但是,如果您可以将建议的语法与促进不可变类型的简洁声明的其他语言功能结合起来,那么建议的语法会变得特别好;如果我们在假设的未来版本的语言中做这样的功能,那么你提出的语法就会变得更有说服力。
我进一步指出,我们通常会抵制需要从“外部”到“内部”进行推断的特征;我们更喜欢那种由内而外的信息流。例如考虑这个问题:
M(new(blah));
假设 M 有两个重载,一个采用 C,另一个采用 D。那是“new C(blah)”还是“new D(blah)”?也可以是。现在我们必须分析两者!如果它们都有效,那么我们必须找出哪个更好。
它变得更糟。假设你有
M(new(new(blah)));
其中 M 再次接受 C 和 D,C 有两个接受 E 或 F 的构造函数,D 有两个接受 G 和 H 的构造函数。
M(new C(new E(blah)));
M(new C(new F(blah)));
M(new D(new G(blah)));
M(new D(new H(blah)));
被选中,为什么?
当您从外到内推理时,您很快就会进入“组合爆炸”,其中要分析的案例数量在嵌套深度变为 O( cn )。
C# 确实以这种方式对 lambda 进行推理,相信我,这是编译器中最难实现高性能和正确的部分之一。我们并不急于向构造函数添加类似的功能。如果我们要添加这种语法,它可能仅限于通过分析变量声明或赋值表达式的左侧明确知道类型的情况。
(与往常一样,我注意到 Eric 对没有时间表或预算的未宣布和完全虚构的产品中假设的未来语言功能的沉思仅用于娱乐目的,不应被解释为对具有任何特定功能的任何特定未来产品的承诺放。)