C#规范(团队?委员会?)是否曾考虑过这种对象创建语法?

Aar*_*ide 12 c# syntax language-design language-specifications

我从来没有公布这种性质的问题之前,因此,如果它是不恰当的,只需不伤害我的感情太糟糕了,我会删除它.

为了尽可能保持我所关心的一切尽可能接近左边距,我一直希望能写出如下内容:

DataService1.DataEntities dataEntities = new(constructorArg1, ...)
Run Code Online (Sandbox Code Playgroud)

我认为另一个原因是我喜欢通过使用var获得的额外屏幕空间,当类型已经出现在作业的右侧时,但我的大脑有太多年来在左侧寻找类型.再说一遍,被困在我的方式并不是一个很好的理由,希望有一个规范......

Eri*_*ert 24

C#设计委员会是否曾考虑过这种对象创建语法?

是的我们有.几年前我们考虑过它.作为此声明的证据,请参阅我的文章的最后一段:

http://blogs.msdn.com/b/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx

设计团队的共识是,这是一个"最好有"的功能,但没有足够的吸引力,这是值得的设计的相当大的成本,实现,测试,记录和维护功能.

我还注意到,我链接到的博客条目的评论对该功能非常不利; 似乎很多人发现语法没有吸引力.这也是反对做这个功能的要点.

但是,如果您可以将其与其他语言功能相结合,以促进简单的不可变类型声明,那么所提出的语法就变得特别好了.如果我们在假设的未来版本的语言中做这样的功能,那么你提出的语法会变得更加引人注目.

我进一步注意到,我们通常会抵制需要从"外部"到"内部"进行推理的特征; 我们更喜欢从内到外的类型信息流.考虑一下这个问题:

M(new(blah));
Run Code Online (Sandbox Code Playgroud)

假设M有两个重载,一个采用C,一个采用D.是"新C(blah)"还是"new D(blah)"?它可能是.现在我们要分析两者!如果他们都工作,那么我们必须弄清楚哪个更好.

它变得更糟.假设你有

M(new(new(blah)));
Run Code Online (Sandbox Code Playgroud)

其中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)));
Run Code Online (Sandbox Code Playgroud)

选择了,为什么?

当你从外到内进行推理时,你很快就会进入"组合爆炸",在那里分析的病例数在嵌套深度变成O(c n).

C#不以这种方式为lambda表达式的原因,那就是编译器,使高性能和正确的,相信我的最困难的部分之一.我们并不急于为构造函数添加类似的功能.如果我们要添加这种语法,它可能仅限于通过分析变量声明或赋值表达式的左侧明确知道类型的场景.

(与往常一样,我注意到Eric对于没有时间表或预算的未经宣布且完全虚构的产品中假设的未来语言特征的思考仅仅是为了娱乐目的,不应被解释为对具有任何特定功能的任何特定未来产品的承诺组.)

  • 我想更多地了解您对假设特征的看法,这些特征使得使用不可变类型更容易.该领域缺乏语言支持是我目前对C#的主要烦恼之一. (3认同)