我从Jon Skeet的“C#深度”中得到了这个。
他提到以下是有效的
(1) class Sample<T> where T:class,Stream
以下内容无效
(2) class Sample<T> where T:Stream,class
第二个无效的原因是什么?
答案 0 :(得分:9)
我认为type constraint按值(struct
)或引用(class
)必须位于第一位,就像new
约束必须是最后如果他们不止一个。
此外,约束本身没有多大意义,Stream
是一个类,T
只能通过该约束来引用类型(class
),所以基本上它是相当的多余的。
答案 1 :(得分:6)
在C#语言规范第10.1.5章中提到:
where子句中给出的约束列表可以包括以下任何组件,按此顺序:单个主要约束,一个或多个辅助约束以及构造函数约束,新()。 主要约束可以是类类型或引用类型约束类或值类型约束结构。辅助约束可以是类型参数或接口类型。
我加粗了相关的短语。
答案 2 :(得分:4)
class Sample<T> where T : class, Stream, new()
(这是所谓的有效示例)也是无效的,因为它是多余的。如果T
派生自Stream
(这是一个类),那么它显然将成为引用类型。
第二个例子也是无效的,但这一次是因为类/结构约束必须先行(就像构造函数约束必须最后一样)。
有传言称这是第二版修复的。与作者关系密切的消息来源表明,第一个例子可能已改为:
class Sample<T> where T : class, IDisposable, new()
就我个人而言,我认为这样的错误让它超过了第一版的技术评审员,这是令人震惊的;)
答案 3 :(得分:2)
使用Where.best,
时,“class”或“struct”约束必须在任何其他约束之前