为什么不能将OUT泛型修饰符应用于类和接口?

时间:2012-08-10 18:59:46

标签: c#

  

可能重复:
  Why isn't there generic variance for classes in C# 4.0?

示例:

interface foo<out T> where T : BaseThing { }

编译

class foo<out T> where T : BaseThing { }

没有。

这是不受支持的,还是有某种原因导致它无法正常工作或没有逻辑意义?

编辑:这是我想要做的事,万一有人想知道......

        class BaseThing { }
        class DerivedThing : BaseThing { }

        class foo<out T> where T : BaseThing { }
        class bar : foo<DerivedThing> { }

        private void test()
        {
            foo<BaseThing> fooInstance = new bar();
        }

1 个答案:

答案 0 :(得分:3)

out修饰符告诉编译器类型参数可以是协变的。这意味着可以更多地使用T类型。由于您使用的是特定类(例如构造的泛型类型),因此只有一个具体类型的实例,因此没有更多派生类型。多个类型可以实现像foo这样的接口,这意味着您正在处理可能不同类型的T,在这种情况下,这些T类型中的一个可能更加派生。