c# - 两个协变接口的 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);
}
其目的是允许可选的“跟踪器”查看事情发生/修改执行者的结果。
解决方案
只需修改Tracer<in T>
为Tracer
(非通用)并定义void Perform(T t, Tracer tracer);
. 无论如何,您的代码都没有使用T
。Tracer
由于您使用新的详细信息编辑了您的问题,因此另一种解决方法是从泛型定义中删除。你不需要它。实现您想要的另一种方法如下:
public interface Performer<T>
{
bool Perform(T t, Tracer tracer = null);
}
public interface Tracer
{
bool Notify<T>(Performer<T> performer);
}
注意:删除 ref bool 并返回 bool
推荐阅读
- c# - SQL 如何替换一个值
- python - 使用 python 和请求,如何进行正确的 POST 调用以及在哪里找到标头?
- android - FirebaseAppDistribution:appDistributionUpload gradle 命令中缺少应用程序 ID
- mysql - 跨列和行计算值的实例
- javascript - 使用 redux 钩子时使用 redux 操作的最佳选择是什么?
- sql - Impala 2.11:AnalysisException:选择列表中不支持子查询
- swift - 在 SwiftUI 中获取当前的经纬度
- c++ - 是否可以禁止一个类被动态转换为?
- git - Git - 将发布分支合并到主分支
- tensorflow - 任何想法如何解决激活函数的问题?