在C#泛型中这两行代码是一样的吗?

时间:2011-06-04 10:50:05

标签: c# .net oop

在阅读关于泛型的内容时,我遇到了这两个代码块,我想知道它们是否相同?

public abstract class Search<T, TCollection, TCriteria>
        where TCollection : Collection<Name>
        where T : Name

public abstract class Search<Name, Collection<Name>, TCriteria>

2 个答案:

答案 0 :(得分:5)

不,因为在第二个中您指定了一个具体的泛型参数,但在第一个参数中,您指定泛型参数可以是where子句中指定类型的任何子类。

答案 1 :(得分:1)

正如Lasse指出的那样,你的第二个版本没有编译。如果您将其更改为

public abstract class Search<Name, Collection, TCriteria>

它会编译,但它不会做你想要它做的事情:这只是指定一个具有三个类型参数的泛型类,称为NameCollectionTCriteria。但它不会以任何方式限制它们,因此您可以创建一个类似Search<int, long, ulong>的实例。

类型参数通常以T开头,但语言不以任何方式强制执行。

所以区别在于第二个版本不起作用,使用第一个版本。