c# - 支持单个类型参数的协变和逆变

标签 c# generics interface covariance contravariance

<分区>

Possible Duplicate:
Covariance and Contravariance on the same type argument

您可以使用 out 关键字将泛型类型参数声明为协变的:

interface ICovariant<out R>

您可以使用 in 关键字将泛型类型参数声明为逆变:

interface IContravariant<in R>

而且您还可以同时支持不同类型的参数:

interface IVariant<out R, in A>

那么,为什么不能为单个类型参数同时支持这两种方法呢?

最佳答案

So why can't you suport both for a single type parameter?

请记住,如果类型参数是输出安全的,那么接口(interface)只能在类型参数中是协变的,而如果类型参数是输入安全的,则接口(interface)只能在类型参数中是逆变的。

语法 out T 表示 T 是协变类型参数。

语法 in T 表示 T 是逆变类型参数。

由于 T 是协变类型参数,因此根据定义它是输入不安全的。

由于 T 是逆变类型参数,因此根据定义它是输出不安全的。

因此,T 是输入不安全和输出不安全的。

因此,T在输入位置被禁止,T在输出位置被禁止。

因此,T既不能出现在接口(interface)指定的任何方法的输入位置,也不能出现在任何输出位置。

因此,T根本不能用在接口(interface)上,作为类型参数也毫无意义。因此,语言设计者甚至禁止您在接口(interface)上包含这种标记为协变和逆变的无用类型,以避免丑陋

interface IFoo<in and out T> { }
Foo<T> : IFoo<T> { }

然后:

IFoo<Cat> cat = (IFoo<Animal>)new Foo<Dog>();

(如果您需要阅读输入安全和输出安全,请参阅语言规范的 13.1.3.1。)

关于c# - 支持单个类型参数的协变和逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6709148/

相关文章:

java - 为什么类型推断在这里失败了?

c# - 类继承,强制新类实现某些功能

java - Mongo Java 驱动程序找不到接口(interface)的公共(public)构造函数

java - "Multi-level"泛型,带有子类化和接口(interface)

c# - 如何创建包含开放通用接口(interface)的 List<T> ?

c# - 在非异步方法中调用异步方法

c# - 将 InternalsVisibleTo 用于单元测试代码是否被认为是不好的做法?

c# - 执行 PowerPoint 自动化时如何避免 RPC_E_CALL_REJECTED 异常?

c# - 如何使用NodaTime FakeClock进行时间旅行并测试不同的虚拟时间实例

java - 有没有一种类型安全的方法可以在 java 中将空列表作为参数传递?