C# 有没有办法实现以下功能:
class MyClass<T> where T : BaseTypeInner {}
class BaseTypeInner {}
class A : BaseTypeInner {}
class B : BaseTypeInner {}
void Main()
{
MyClass<BaseTypeInner> variant;
variant = new MyClass<A> (); // ERROR: Cannot implicitly convert type 'UserQuery.MyClass<UserQuery.A>' to 'UserQuery.MyClass<UserQuery.BaseTypeInner>'
variant = new MyClass<B> ();
}
最佳答案
在 C# 中,只有接口(interface)可以变化。引用 C# 规范:
Variant type parameter lists can only occur on interface and delegate types.
因此您可以声明一个通用的协变接口(interface) IBaseClass<out T>
,使BaseClass<T>
实现它,然后转换为 IBaseClass<BaseTypeInner>
而不是转换到类(class)。
interface IMyClass<out T> where T : BaseTypeInner { }
class MyClass<T> : IMyClass<T> where T : BaseTypeInner { }
IMyClass<BaseTypeInner> variant;
variant = new MyClass<A>(); // works just fine
variant = new MyClass<B>();
关于c# - 泛型类的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31797943/