当C#和CLI与值类型和构造函数一起使用时,有什么区别?

Dav*_*Dev 8 .net c# constructor command-line-interface value-type

我最近读到C#和CLI标准定义了处理值类型和构造函数的不同方法.

根据CLI规范,值类型不能具有无参数构造函数,而在C#规范中,值类型具有默认的无参数构造函数.如果根据CLI规范,您需要在不指定任何参数的情况下创建值,那么可以使用特殊指令来执行此操作.

所以我的问题是

  • 为什么C#设计者会故意偏离CLI标准 - 这有什么好处,为什么CLI不允许这个功能呢?
  • 在我有限的经验中,任何时候我发现自己使用"特殊指令"来允许最初没有预期的功能,这通常是一个黑客攻击.这有什么不同?

Jon*_*eet 7

在各个地方,从一致性的观点来看,将值类型视为具有无参数构造函数是有意义的.您始终可以在不提供任何参数的情况下创建值,这在CLI和C#中都是如此.在C#中,您可以使用标准构造函数语法:

int x = new int();
Run Code Online (Sandbox Code Playgroud)

而不是有一个语法和调用"真正的"构造函数的不同语法.

请注意,从C#2开始,我认为可以使用默认值运算符:

int x = default(int);
Run Code Online (Sandbox Code Playgroud)

真的,感觉更接近于IL.我想如果我们开始使用它是可能的,C#就不会"假装"所有值类型都有无参数构造函数.

另一方面,考虑泛型:

public void Foo<T>() where T : new()
{
    T t = new T();
}
Run Code Online (Sandbox Code Playgroud)

是否应该允许值类型?它 - 但如果C#不允许,new int()那么以通用形式允许它就没有多大意义......

您可能希望更深入地看一个有趣的观点 - 尽管C#不允许您定义自定义值类型无参数构造函数,但您可以在IL中执行此操作,而C#有时会使用它(有时不会),具体取决于上下文.请参阅有关详细信息,我的博客文章.