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?
当我写这个问题时,我想出了答案,并认为我会发布它而不是删除问题.
我只需要重新定义这个类:
public class MyClass<T> where T : BaseClass, IInterface
{
public MyClass(T value)
{
Register(value);
}
}
Run Code Online (Sandbox Code Playgroud)