为什么在泛型参数约束中强制执行某些顺序?在为泛型类型参数定义约束时,我们必须将class()放在最前面,new()放在最后。为什么会这样,为什么我不能按任何顺序放置约束?最后除了class/struct,new()还有其他限制吗?示例:protectedTClone()whereT:class,ICopyable,new()选择此顺序没有特别的原因。选择的顺序从更一般到更具体,我认为这是一个很好的属性。至于“为什么需要命令?”这个问题,实现和测试团队更容易通过语言强加清晰、明确的命令。我们可以允许约束以任何顺序出现,但这对我们有什么帮助呢?我在语言方面工作的时间越长,我就越觉得每次你给用户一个选择,你就给了他们做出错误选择的机会。C#的基本设计原则是我们会在您犯错时告诉您并强迫您改正-这不是JavaScript的基本设计原则。它的基本设计原则是“混淆并尝试按照用户的意思去做”。通过对C#中正确语法的更多约束,我们可以更好地确保预期的语义在程序中得到很好的表达。例如,如果我今天正在设计一种类似C#的语言,我将无法使用像这样的模棱两可的语法:classC:X,Yor...其中T:X,YY显然是一个接口。是X?我们无法从语法上判断X是一个接口还是一个类。可以说,这种模糊性使得检测基类型和接口的循环等问题变得非常复杂。对于所有相关人员来说,如果它更冗长,就像在VB中一样容易。像大多数与语法相关的问题一样,基本答案是因为规范如此规定。我们从C#5.0规范中获得了以下针对泛型类型约束的语法(第10.1.5节):primary-constraintsecondary-constraintsconstructor-constraintprimary-constraint,secondary-constraintsprimary-constraint,constructor-constraintsecondary-constraints,constructor-约束primary-constraints,secondary-constraints,constructor-constraintprimaryconstraints:class-typeclassstructsecondaryconstraints:interface-typetype-parametersecondary-constraints,interface-typesecondary-constraints,type-parameterConstructorConstraints:new()埃里克Lippert很好地解释了为什么要这样设计,所以我不会详细说明。以上是C#学习教程:Whyarecertainorderingsenforcedingenericparameterconstraints?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
