在下面的代码中,有两个具有协方差/逆变的通用委托声明:
// 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)
我不太确定原因......