例如,在定义泛型类型参数的约束时,我们必须将 class()
放在前面,将 new()
放在最后。
这是为什么,为什么我不能按任何顺序放置我的约束?
除了class
/struct
在前,new()
在最后,还有其他的排序限制吗?
例子:
protected T Clone<T>() where T : class, ICopyable<T>, new()
最佳答案
选择该顺序没有特别的原因。选择的顺序从更一般到更具体,我认为这是一个相当不错的属性。
至于“为什么需要顺序?”这个问题,对于实现和测试团队而言,语言强加的清晰、明确的顺序更容易。我们可以允许约束以任何顺序出现,但这能给我们带来什么?
我在语言方面工作的时间越长,我就越认为每次给用户选择时,他们就有机会做出错误的选择。 C# 的一个基本设计原则是当事情看起来不对时我们会告诉你并强制你改正——这不是 JavaScript 等的基本设计原则。它的基本设计原则是“得过且过,想用户所想”。通过对 C# 中的正确语法 施加更多限制,我们可以更好地确保预期的语义 在程序中得到很好的表达。
例如,如果我今天正在设计一种类似 C# 的语言,我就不可能有像这样的模棱两可的语法:
class C : X , Y
或
... where T : X, Y
Y 显然打算成为一个接口(interface)。是X吗?我们无法从语法上判断 X 是打算成为接口(interface)还是类。可以说这种歧义使诸如检测基类型与接口(interface)中的循环等事情变得非常复杂。如果它像在 VB 中那样更冗长,那么对所有相关人员来说都会容易得多。
关于c# - 为什么在通用参数约束中强制执行某些顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32884375/