Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何约束泛型扩展的类型_C#_Generics - Fatal编程技术网

C# 如何约束泛型扩展的类型

C# 如何约束泛型扩展的类型,c#,generics,C#,Generics,我试图扩展一个特定的类(比如WPF的StackPanel)。让我们把这个扩展名称为MyGenericPanel。我想它的声明应该是: class MyGenericPanel : StackPanel 但是。。。如果我希望此扩展保存引用的变量类型(例如T),则声明将变为: class MyGenericPanel<T> : StackPanel 类MyGenericPanel:StackPanel 现在,如果我想限制T是可识别的类型。。。其中可识别的是另一个类 class My

我试图扩展一个特定的类(比如WPF的StackPanel)。让我们把这个扩展名称为MyGenericPanel。我想它的声明应该是:

class MyGenericPanel : StackPanel
但是。。。如果我希望此扩展保存引用的变量类型(例如T),则声明将变为:

class MyGenericPanel<T> : StackPanel
类MyGenericPanel:StackPanel
现在,如果我想限制T是可识别的类型。。。其中可识别的是另一个类

class MyGenericPanel<T> where T: Identifiable, StackPanel
类别MyGenericPanel,其中T:可识别,StackPanel
抱怨StackPanel应该放在第一位。。。如果我把

class MyGenericPanel<T> where T: StackPanel, Identifiable
类MyGenericPanel,其中T:StackPanel,可识别
编译器抱怨应在StackPanel之前出现

底线:

  • MyGenericPanel扩展了StackPanel
  • T是可识别函数的一个扩展
  • MyGenericPanel没有XAML定义。。。这只是C代码

  • 我该怎么做?。。。(或者,可以这样做吗?

    MyGenericPanel
    extends
    StackPanel

    T
    可识别的

    翻译成

    class MyGenericPanel<T> : StackPanel where T : Identifiable
    
    class MyGenericPanel:StackPanel,其中T:可识别
    
    我认为您混淆了基类的规范和泛型类型约束:

     class MyGenericPanel<T> : StackPanel where T: Identifiable
    
    class MyGenericPanel:StackPanel,其中T:可识别
    
    MyGenericPanel:
    之后的类是基类,
    之后的类,其中T:
    是泛型类型约束

    现在,如果我想限制T是可识别的类型。。。哪里 可识别是另一类

    如果
    identification
    StackPanel
    都是类,那么它就不能工作,因为放置两个类类型的约束将意味着多重继承,这在C#中是不允许的。这就是为什么编译器抱怨您的限制

    如果您想让您的
    MyGenericPanel
    扩展
    StackPanel
    的功能,并将
    T
    限制为
    可识别的类型
    ,则以下操作可行:

    class MyGenericPanel<T> : StackPanel where T : Identifiable
    
    class MyGenericPanel:StackPanel,其中T:可识别
    
    当您总是将泛型类型约束放在自己的行上时,整个事情就变得更加清楚了。就是这样。非常感谢你。我想将类型T限制为可识别的,而MyGenericPanel是StackPanel的扩展