是否可以在同一个 T 上使用通用的“in”和“out”修饰符?

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 中呢?或者是否可以使用不同的语法?

Ser*_*rvy 5

in T说 T不能协变使用,并且out T说 T不能逆变使用。in out T因此,您的意思是该类型不能协变使用,也不能逆变使用,这意味着它是不变的。因此,实际上,这与仅写入的行为相同public interface IInOut<T>,因为当不使用inorout修饰符时,泛型类型被认为是不变的

在您的 class 的情况下,InOutWorkaround<T>,T仍然是不变的,因此您将它用作 aninouttype的事实很好,因为它是不变的,因为它满足这两个限制。如果你尝试有可能被使用的类型协变和contravariantly,你的解决方法并没有做到这一点,因为TInOutWorkaround不变的(因为所有班级所有泛型类型参数是不变的)。该泛型类型参数不能协变或逆变使用。