具有多个约束的通用

Mat*_*uwe 2 c# generics inheritance

我正在尝试使用类似于以下的定义调用方法(简化以避免混淆):

public static void Register<T>(T value) where T : BaseClass, IInterface
Run Code Online (Sandbox Code Playgroud)

只要我有一个定义这两个值的类实例,这个工作正常.当我将`BaseClass'传递给方法然后尝试在上面的声明中使用该实例时,会出现问题.例如:

public class MyClass
{
    public MyClass(BaseClass value)
    {
        Register(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以将实现BaseClass和IInterface的类的实例传递给构造函数,但是当我尝试在Register方法中使用该值时,我得到一个编译错误,指出:

类型'BaseClass'不能用作泛型类型或方法'Register(T)'中的类型参数'T'.没有从"BaseClass"到"IInterface"的隐式引用转换.

如果我改变构造函数中的类型,如下所示:

public class MyClass
{
    public MyClass(IInterface value)
    {
        Register(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说明:

"IInterface"类型不能用作泛型类型或方法"Register(T)"中的类型参数"T".没有从"IInterface"到"BaseClass"的隐式引用转换.

这似乎有点像22. 有没有办法可以定义参数来表明它必须同时实现BaseClass和IInterface?

Mat*_*uwe 6

当我写这个问题时,我想出了答案,并认为我会发布它而不是删除问题.

我只需要重新定义这个类:

public class MyClass<T> where T : BaseClass, IInterface
{
    public MyClass(T value)
    {
        Register(value);
    }
}
Run Code Online (Sandbox Code Playgroud)