首页 > 解决方案 > 两个协变接口的 C# 协方差问题

问题描述

我有两个都是协变的接口,它们都像这样相互传递:

public interface Perfomer<in T>
{
    void Perform(T t, Tracer<T> tracer);
}

public interface Tracer<in T>
{
    void Notify();
}

但是,即使两个接口都标记为协变,并且 T 仅用作输入,我仍然收到错误消息:

"Invalid variance: The type parameter 'T' must be covariantly valid on
'Perfomer<T>.Do(T, Tracer<T>)'. 'T' is contravariant. [_Console].

任何想法为什么使用相同类型的协变接口参数会使 T 逆变?


编辑 (对不起,我是 StackOverflow 的新手,根据我意识到我应该在我的问题中更准确的答案,我只是试图尽可能多地消除单个错误的噪音)。

代码实际上有两个接口,接口大体相似:

public interface Performer<in T>
{
    bool Perform(T t, Tracer<T> tracer = null);
}

public interface Tracer<in T>
{
    void Notify(Performer<T> performer, T t, ref bool success);
}

其目的是允许可选的“跟踪器”查看事情发生/修改执行者的结果。

标签: c#.netgenericscovariancecontravariance

解决方案


只需修改Tracer<in T>Tracer(非通用)并定义void Perform(T t, Tracer tracer);. 无论如何,您的代码都没有使用TTracer

由于您使用新的详细信息编辑了您的问题,因此另一种解决方法是从泛型定义中删除。你不需要它。实现您想要的另一种方法如下:

public interface Performer<T>
{
    bool Perform(T t, Tracer tracer = null);
}

public interface Tracer
{
    bool Notify<T>(Performer<T> performer);
}

注意:删除 ref bool 并返回 bool


推荐阅读