输入参数与泛型

时间:2009-08-18 23:18:49

标签: c# generics

是否有理由使用Type参数而不是泛型,即:

// this...
void Foo(Type T);
// ...over this.
void Foo<T>();

在我看来,泛型更有用,因为它们提供了泛型约束和C#4.0,逆变和协变,以及可能还有一些我不知道的其他功能。在我看来,通用形式具有所有优点,并且没有第一个也不具有的负面效果。那么,有没有你使用第一个的情况呢?

3 个答案:

答案 0 :(得分:9)

绝对:在执行时间之前你不知道类型。例如:

foreach (Type t in someAssembly.GetTypes())
{
    Foo(t);
}

Foo是通用的时候这样做是一个痛苦的屁股。这是可行的,但很痛苦。

它还允许参数为null,这在某些情况下会有所帮助。

答案 1 :(得分:1)

Foo(someVariable.GetType());      // allowed

Foo<someVariable.GetType()>();    // illegal

答案 2 :(得分:0)

他们真的不一样。

对于第二个,你实际上有一个编译时类型的类(无论是谁传递的)。所以你可以在它上面调用特定的函数(比如它是否都是某个给定的接口)。

在你的第一个例子中,你有一个类'Type'的对象。所以你需要仍然确定它是什么,并做一个演员来做任何有用的事情。