使用泛型类型参数还是使用其类型约束?

时间:2019-01-18 01:12:24

标签: c# generics

假设我具有这样的类结构,其中类FooBaseDerived1等类层次结构的泛型。

abstract class Base {...}

class Derived1 : Base {...}

.
.
.

class Derivedn : Base {...}


class Foo<T> where T : Base
{
   /// XXX is a placeholder - see below
   void DoBar(XXX arg) {...}
   ...
}

想要DoBar()来处理源自Base事物,如果XXXBaseT吗?

该约束意味着T必须是Base或其子元素之一;但在DoBar()的范围内,它将以任何一种方式将其视为类型为Base的对象-因此,从表面上看,这没有什么区别。但是我可能忽略了一些更微妙的东西。

1 个答案:

答案 0 :(得分:3)

如果将xxx设置为Base,则方法参数可以是Base或从Base派生的任何类。 如果将xxx设置为T,则方法参数可以是T类或从T派生的任何类。

因此,例如,如果您使用通用类型Foo实例化Derived1类,则在第一种情况下,您可以使用Base或从Base派生的类,并且在第二种情况,您只能使用Derived1或从Derived1派生的类