c# - 泛型类的协方差

标签 c# generics types

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/

相关文章:

c# - 在 Lucene 中索引多个表

c# - System.IO.Directory.Delete方法只是将文件发送到回收站。有什么办法可以永久删除吗?

javascript - 检查实例是否由 javascript 中的相同构造函数构造

swift - 扩展到通用结构,其中元素是通用结构

java - 违抗泛型?可以将狗添加到列表<? super 猫>

haskell - 如何手动推断表达式的类型

scala - 如何从类型中提取类型参数

c# - 按模型分组并选择模型

c# - Entity Framework 3.5 中的左连接

typescript - 确定泛型方法类型的默认参数