C#4.0 RC,Silverlight 4.0 RC协方差

时间:2010-04-01 06:26:13

标签: c# silverlight c#-4.0 covariance

我正在尝试使用C#4.0开发Silverlight 4应用程序。 我有这样的案例:

public class Foo<T> : IEnumerable<T>
{
    ....
}

其他地方:

public class MyBaseType : MyInterface
{
    ...
}

我遇到问题的用法:

Foo<MyBaseType> aBunchOfStuff = new Foo<MyBaseType>();
Foo<MyInterface> moreGeneralStuff = myListOFStuff;

现在我认为这在C#3.0中是不可能的,因为泛型类型是“不变”。但是我认为通过新的协方差技术可以在C#4.0中实现这一点吗?

据我了解,在C#4.0中,许多常见接口(如IEnumerable)已被修改以支持方差。在这种情况下,我的Foo类需要什么特殊才能变成协变?

Silverlight 4(RC)是否支持协方差?

2 个答案:

答案 0 :(得分:4)

要在T中指明接口或委托的泛型类型参数是协变的,您需要提供out关键字。

然而,目前这对课程来说是不可能的。我建议创建一个带有协变泛型类型参数的接口,让你的类实现它。

至于Silverlight 4中的协方差支持:在beta版本中它不受支持,我需要检查它们是否已在候选版本中实现它。编辑:显然是。

EDIT2: 由于BCL中的某些类型没有设置适当的泛型类型修饰符(IEnumerable<T>,{{1},因此SL4实际上是否支持接口和委托的共同和逆变可能会有一些混淆。 },Action<T>,...)。

Silverlight 5解决了这些问题:http://10rem.net/blog/2011/09/04/the-big-list-of-whats-new-or-improved-in-silverlight-5

SL4编译器确实支持Func<T>in修饰符。以下编译并按预期工作:

out

答案 1 :(得分:1)

协处理仅支持接口和代理:

public interface Foo<out T> { }
public class Bar<T> : Foo<T> { }

interface MyInterface { }
public class MyBase : MyInterface { }

Foo<MyBase> a = new Bar<MyBase>();
Foo<MyInterface> b = a;

重要的是out - 界面Foo上的关键字。