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中一样.