C#泛型无效的原因

时间:2009-11-14 07:22:05

标签: c# generics

我从Jon Skeet的“C#深度”中得到了这个。

他提到以下是有效的

(1) class Sample<T> where T:class,Stream

以下内容无效

(2) class Sample<T> where T:Stream,class

第二个无效的原因是什么?

4 个答案:

答案 0 :(得分:9)

我认为type constraint按值(struct)或引用(class)必须位于第一位,就像new约束必须是最后如果他们不止一个。

此外,约束本身没有多大意义,Stream是一个类,T只能通过该约束来引用类型(class),所以基本上它是相当的多余的。

答案 1 :(得分:6)

在C#语言规范第10.1.5章中提到:

where子句中给出的约束列表可以包括以下任何组件,按此顺序:单个主要约束,一个或多个辅助约束以及构造函数约束,新()。 主要约束可以是类类型或引用类型约束类或值类型约束结构。辅助约束可以是类型参数或接口类型。

我加粗了相关的短语。

答案 2 :(得分:4)

事实上,the author is mistaken

class Sample<T> where T : class, Stream, new()

(这是所谓的有效示例)也是无效的,因为它是多余的。如果T派生自Stream(这是一个类),那么它显然将成为引用类型。

第二个例子也是无效的,但这一次是因为类/结构约束必须先行(就像构造函数约束必须最后一样)。

有传言称这是第二版修复的。与作者关系密切的消息来源表明,第一个例子可能已改为:

class Sample<T> where T : class, IDisposable, new()

就我个人而言,我认为这样的错误让它超过了第一版的技术评审员,这是令人震惊的;)

答案 3 :(得分:2)

使用Where.best,

时,“class”或“struct”约束必须在任何其他约束之前