我想知道为什么这样的东西毕竟是允许的?
interface IProducer<out T> where T : struct
如果struct是值类型,则协方差不起作用,因为struct是值类型。我在这里想念的是什么?
答案 0 :(得分:0)
如果你查看MSDN Generic out modifier,那么声明输出的类型参数必须满足两个条件:
就代码而言,区别在于:
interface ITest<out T1, T2>
{
T1 GetValue();
T2 GetValue2();
void SetValue(T1 Arg1); //Compile Error, Condition 1
void SetValue(T2 Arg1);
void SetValue2<T3>(int Arg) where T3 : T1; //Compile Error, Condition 2
void SetValue<T3>(int Arg) where T3 : T2;
}
因此,您的T1不能用作方法的输入参数,也不能用作另一个通用约束。
由于您有约束声明T必须是结构,因此自动满足条件2。
因此,添加这两个语句意味着:
只能用作返回值(
where T: struct
)的结构(out
)。
答案 1 :(得分:0)
如果您声明接口
interface IProducer<out T> where T : struct
那么很对,您将无法使用协方差,因为它不适用于结构,但是仍然可以使用,因为协方差不是out
修饰符的唯一作用。
它还限制了使用泛型类型来返回类型,这意味着您将无法在接口中添加这样的成员
void MyMethod(T t);
这可能不是很有用,但是有人可以使用它来执行此规则,因此没有理由不支持该语言。