类型参数与泛型

8

是否有使用 Type 参数而不是泛型的理由?例如:

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

在我看来,泛型更加有用,因为它们提供了泛型约束,并且随着C# 4.0的推出,还有逆变性和协变性等其他特性,这些可能是我不知道的。对我来说,泛型形式具有所有优点,而第一种方式没有任何负面影响。那么,是否存在你会使用第一种方式的情况呢?

3个回答

10

当你在执行时不知道类型时,可以使用 Absolutely。例如:

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

Foo 是泛型时,这样做很痛苦。虽然可行,但很痛苦。

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


使用泛型做这件事也更加昂贵和缓慢(所有那些反射调用不会很漂亮)。 - Matthew Scharley
2
当然可以 - 尽管对我来说痛苦通常更重要 :) - Jon Skeet

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

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

1

实际上它们并不相同。

在第二个例子中,你实际上有一个编译时类型的类(由传递给它的人决定)。因此,你可以调用特定的函数(例如,如果它是某个给定接口的全部)。

在你的第一个例子中,你有一个“Type”类的对象。因此,你仍需要确定它是什么,并进行转换才能对其执行任何有用的操作。


准确地说,第二种形式具有编译时检查的所有优点。因此,考虑到其他因素,我想知道是否有使用第一种形式的理由。我意识到它们是不同的,但不同并不意味着一种形式完全取代了另一种形式的需求。 - Matthew Scharley
我的意思是你将会把第一个用于完全不同的目的,与第二个不同。你永远也不会将它们用于相同的事情(例如:调用常规方法或对给定类类型执行“通用”操作)。 - Noon Silk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接