我正在尝试使用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)是否支持协方差?
答案 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
上的关键字。