R1P*_*ake 1 c# generics interface
此代码无效,因为 T 不能同时具有 in 和 out 修饰符:
public interface IInOut<in out T>
{
}
Run Code Online (Sandbox Code Playgroud)
但是您可以执行此“解决方法”:
public interface IInOutWorkaround<in TIn, out TOut>
{
TOut Test(TIn value);
}
public class InOutWorkaround<T> : IInOutWorkaround<T, T>
{
public T Test(T value)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
第二个示例有效并且 InOutWorkaround 类对于 TIn 和 TOut 具有相同的类型,那么为什么不能直接在接口中将这两个修饰符添加到同一个 T 中呢?或者是否可以使用不同的语法?
in T说 T不能协变使用,并且out T说 T不能逆变使用。in out T因此,您的意思是该类型不能协变使用,也不能逆变使用,这意味着它是不变的。因此,实际上,这与仅写入的行为相同public interface IInOut<T>,因为当不使用inorout修饰符时,泛型类型被认为是不变的。
在您的 class 的情况下,InOutWorkaround<T>,T仍然是不变的,因此您将它用作 anin和outtype的事实很好,因为它是不变的,因为它满足这两个限制。如果你尝试有可能被使用的类型既协变和contravariantly,你的解决方法并没有做到这一点,因为T在InOutWorkaround是不变的(因为所有班级所有泛型类型参数是不变的)。该泛型类型参数不能协变或逆变使用。