小编tko*_*kof的帖子

C#泛型委托中的协方差/逆变问题

在下面的代码中,有两个具有协方差/逆变的通用委托声明:

// wrong code since Delegate1 actually needs covariance
public delegate void Delegate1<in T>();
public delegate void Delegate2<in T>(Delegate1<T> d1);
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我们可以将Delegate1的声明调整为协方差

// ok
public delegate void Delegate1<out T>();
public delegate void Delegate2<in T>(Delegate1<T> d1);
Run Code Online (Sandbox Code Playgroud)

但如果我将" Delegate2<in T>(Delegate1<T> d1)" 调整为" Delegate2<in T>(Delegate1<Delegate1<T>> d1)",则下面的代码都可以(无论Delegate1是协方差还是反方差)

// ok
public delegate void Delegate1<in T>();
public delegate void Delegate2<in T>(Delegate1<Delegate1<T>> d1);
Run Code Online (Sandbox Code Playgroud)
// ok too
public delegate void Delegate1<out T>();
public delegate void Delegate2<in T>(Delegate1<Delegate1<T>> d1);
Run Code Online (Sandbox Code Playgroud)

我不太确定原因......

c# covariance contravariance

1
推荐指数
1
解决办法
203
查看次数

标签 统计

c# ×1

contravariance ×1

covariance ×1