为什么在泛型参数约束中强制执行某些排序?

Geo*_*ett 19 c# generics language-design constraints

在定义泛型类型参数的约束时,我们必须放在class()前面和后面new(),例如.

为什么这样,为什么我不能以任何顺序放置我的约束?

除了class/ struct首先,new()最后还有其他任何限制?


例:

protected T Clone<T>() where T : class, ICopyable<T>, new()
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 25

选择该订单没有特别的理由.所选择的顺序从更一般到更具体,我认为这是一个相当不错的属性.

至于"为什么需要订单?"这个问题,实施和测试团队可以更容易地通过语言强加清晰,明确的顺序.我们可以允许约束以任何顺序出现,但这会给我们带来什么?

我在语言上工作的时间越长,我就越觉得每次给用户一个选择时,你就给他们一个做出错误选择的机会.C#的基本设计原则是我们告诉你什么时候出错了并强迫你做对了 - 这不是JavaScript的基本设计原则.它的基本设计原则是"混淆并尝试做用户的意思".通过对C#中正确语法的更多限制,我们可以更好地确保在程序中很好地表达预期的语义.

例如,如果我今天正在设计一种类似C#的语言,那么我就无法使用如下模糊语法:

class C : X , Y
Run Code Online (Sandbox Code Playgroud)

要么

... where T : X, Y
Run Code Online (Sandbox Code Playgroud)

Y显然是一个界面.是X?我们无法从语法上说出X是打算成为接口还是类.可以说这种模糊性使得检测基类型与接口中的周期等问题变得非常复杂.对于所有相关的事情来说,如果它更加冗长,就像在VB中一样.

  • 我总是觉得奇怪的是C#表达继承和实现接口的方式不同于Java(明确地说它),当C#在大多数其他方面受Java影响很大时.更糟糕的是,正如你所说它使编译器工作变得复杂. (2认同)