与结构约束的协方差

时间:2017-11-14 07:13:18

标签: c# struct covariance value-type

我想知道为什么这样的东西毕竟是允许的?

interface IProducer<out T> where T : struct

如果struct是值类型,则协方差不起作用,因为struct是值类型。我在这里想念的是什么?

2 个答案:

答案 0 :(得分:0)

如果你查看MSDN Generic out modifier,那么声明输出的类型参数必须满足两个条件:

  • type参数仅用作接口方法的返回类型,不用作方法参数的类型。
  • type参数不用作接口方法的通用约束。

就代码而言,区别在于:

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);

这可能不是很有用,但是有人可以使用它来执行此规则,因此没有理由不支持该语言。