使 C# 6 struct 无参数构造函数不可用

Making C# 6 struct parameterless constructor unusable

C# 6 允许在结构上声明无参数构造函数。但是它们必须是 public 并且在某些情况下有人想强迫其他开发人员使用参数化构造函数,所以我想知道从 CLR 的角度来看是否可以通过在内部抛出异常来使无参数构造函数不可用,所以它看起来像这样:

public struct Foo
{
    public Foo()
    {
        throw new InvalidOperationException("This constructor is not supported.");
    }

    public Foo(int i) { ... }
}

你可以的。至于这是否是一个好主意是相当主观的。 (我强烈反对使用它,但显然我不能阻止你这样做。)

如果您的目标是确保永远不会出现在不调用参数化构造函数的情况下构造对象的情况,并且永远不会将字段保留为默认值,那么这不会做到这一点。有一些方法,例如使用 default(Foo) 创建对象的实例而不调用任何用户定义的构造函数。

如果你问 CLR 是否会崩溃并且世界会因为你从 struct 的构造函数中抛出异常而崩溃成一个黑洞,那么不,那不会发生.当调用此构造函数时,它会抛出并沿着调用堆栈向上移动直到被捕获,就像任何其他抛出的异常一样。