为什么必须最后指定new()约束?

emp*_*mpi 7 .net c# generics constraints

C#编译器需要最后指定new()约束.根据MSDN:

与其他约束一起使用时,必须最后指定new()约束.

为什么会有这样的限制?

jas*_*son 13

因为规范说明了.它可能是这样说的,因为它使得解析约束更容易一些.允许您以任何顺序指定约束几乎没有价值,我可以想象一些成本(包括机会成本!)使其成为可能.

实际上,请注意,如果您拥有它,那么规范并不只是说您必须最后具有构造函数约束.它实际上表示您必须按以下顺序拥有约束

  1. 主要约束.
  2. 次要约束.
  3. 构造函数约束.

如果主要约束是指定类型参数的约束必须是引用类型或值类型,则辅助约束是指定基类或接口的约束,构造函数约束是此处讨论的约束.

规范的相关部分是§10.1.5,绝对值得一读.

  • 实际上,所提出的特征存在成本,几乎没有益处和机会成本.机会成本不仅仅是因为这个功能被用于其他有价值的功能所花费的时间; 这也是我们允许语法变化的任何时候,这使得将来扩展或修改该语法变得更加困难. (4认同)