C# 类型参数与泛型

C# 类型参数与泛型,c#,generics,C#,Generics,是否有理由在泛型上使用Type参数,即: // this... void Foo(Type T); // ...over this. void Foo<T>(); //这个。。。 void-Foo(T型); //…为了这个。 void Foo(); 在我看来,泛型更有用,因为它们提供了泛型约束和C#4.0、逆变和共变,以及一些我不知道的其他特性。在我看来,一般形式有所有的优点,没有第一种形式没有的缺点。那么,是否有使用第一个的情况呢?绝对是这样:直到执行时才知道类型。例如: fo

是否有理由在泛型上使用
Type
参数,即:

// this...
void Foo(Type T);
// ...over this.
void Foo<T>();
//这个。。。
void-Foo(T型);
//…为了这个。
void Foo();

在我看来,泛型更有用,因为它们提供了泛型约束和C#4.0、逆变和共变,以及一些我不知道的其他特性。在我看来,一般形式有所有的优点,没有第一种形式没有的缺点。那么,是否有使用第一个的情况呢?

绝对是这样:直到执行时才知道类型。例如:

foreach (Type t in someAssembly.GetTypes())
{
    Foo(t);
}
Foo
是泛型时这样做是痛苦的。这是可行的,但很痛苦


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

它们实际上根本不一样

对于第二个类,您实际上得到了一个编译时类型的类(不管是谁传入的)。因此,您可以对其调用特定的函数(例如,如果它都是某个给定的接口)

在第一个示例中,有一个类为“Type”的对象。因此,您仍然需要确定它是什么,并进行强制转换以使用它执行任何有用的操作。

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

Foo<someVariable.GetType()>();    // illegal
Foo();//非法的
使用泛型(所有这些反射调用都不可能是很好的)绝对也要昂贵得多,速度也慢得多——尽管痛苦通常对我来说更重要:)确切地说,第二种形式具有编译时检查的所有好处。因此,除其他外,我想知道是否有理由使用第一个。我意识到它们是不同的,但不同并不意味着一种形式不能完全包含对另一种形式的需求。我的观点是,你将使用第一种形式用于与第二种完全不同的目的。您永远不会将它们用于相同的事情(即:调用公共方法或对给定的类类型执行“泛型”操作)。