将Generic实例转换为Base类

时间:2017-01-04 23:29:37

标签: c# wpf generics

我正在尝试尝试诸如

之类的东西
void Main()
{
    Temp<Bar> Test = new Foo<InheritedBar>();
}

abstract class Temp<T> where T : Bar
{

}

class Foo<T> : Temp<T> where T : Bar
{

}

abstract class Bar
{

}

class InheritedBar : Bar
{

}

投射不起作用,错误为Cannot implicity convert type Foo<InheritedBar> to Temp<Bar>.

然而,  Temp<InheritedBar> Test = new Foo<InheritedBar>(); 和  Temp<Bar> Test = new Foo<Bar>();

两者都有效。为什么即使InheritedBar继承自Bar,它也不能通过泛型投射到它?

我在wpf页面中使用泛型类型,它不能创建为泛型,因此我无法将T作为其类型传递。我只想要Temp的这个功能,而不是任何派生版本的功能。有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

您尝试使用的概念是协方差MSDN上的完整说明)

简短的回答是,您需要使用out标记您的通用参数;但是你只能在一个接口上做到这一点(在你的情况下从一个抽象类改变)。此外,根据您的方法参数和返回值,您可能无法将您的界面标记为协变。

interface Temp<out T> where T : Bar
{

}