假设我具有这样的类结构,其中类Foo
是Base
,Derived1
等类层次结构的泛型。
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
的事物,如果XXX
是Base
或T
吗?
该约束意味着T
必须是Base
或其子元素之一;但在DoBar()
的范围内,它将以任何一种方式将其视为类型为Base
的对象-因此,从表面上看,这没有什么区别。但是我可能忽略了一些更微妙的东西。
答案 0 :(得分:3)
如果将xxx
设置为Base
,则方法参数可以是Base
或从Base
派生的任何类。
如果将xxx
设置为T
,则方法参数可以是T
类或从T
派生的任何类。
因此,例如,如果您使用通用类型Foo
实例化Derived1
类,则在第一种情况下,您可以使用Base
或从Base
派生的类,并且在第二种情况,您只能使用Derived1
或从Derived1
派生的类