如何约束泛型扩展的类型

时间:2015-11-09 14:53:16

标签: c# generics

我正在尝试扩展一个特定的类(比如WPF' StackPanel)。我们将此扩展称为MyGenericPanel。我猜它的声明应该是:

class MyGenericPanel : StackPanel

但是......如果我希望这个扩展包含变量类型的引用(比方说T)声明将成为:

class MyGenericPanel<T> : StackPanel

现在如果我想将T限制为类型可识别...其中Identifiable是另一个类。

class MyGenericPanel<T> where T: Identifiable, StackPanel

抱怨StackPanel应该先来......如果我把

class MyGenericPanel<T> where T: StackPanel, Identifiable

编译器抱怨Identifiable应该出现在StackPanel之前。

底线:

  1. MyGenericPanel扩展了StackPanel
  2. T是Identifiable
  3. 的扩展
  4. MyGenericPanel没有XAML定义......它只是C#代码。
  5. 我该怎么做?...(或者,可以吗?)

3 个答案:

答案 0 :(得分:4)

我认为您将基类的规范与泛型类型约束混淆:

 class MyGenericPanel<T> : StackPanel where T: Identifiable

MyGenericPanel<T> :之后的类是基类,where T:之后的类是泛型类型约束

答案 1 :(得分:2)

MyGenericPanel延伸StackPanel

TIdentifiable

的扩展名

翻译成

class MyGenericPanel<T> : StackPanel where T : Identifiable

答案 2 :(得分:0)

  

现在如果我想将T限制为可识别的类型......在哪里呢?   可识别是另一类

如果IdentifiableStackPanel这两个类都比它无法工作那么好,因为放入2类类型约束意味着多重继承,这是C#中不允许的。这就是编译器抱怨你的约束的原因。

如果您的意思是MyGenericPanel<T>扩展StackPanel的功能并将T限制为Identifiable类型,那么以下方法可行:

class MyGenericPanel<T> : StackPanel where T : Identifiable