我正在尝试尝试诸如
之类的东西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的这个功能,而不是任何派生版本的功能。有更好的方法吗?
答案 0 :(得分:3)
您尝试使用的概念是协方差(MSDN上的完整说明)
简短的回答是,您需要使用out
标记您的通用参数;但是你只能在一个接口上做到这一点(在你的情况下从一个抽象类改变)。此外,根据您的方法参数和返回值,您可能无法将您的界面标记为协变。
interface Temp<out T> where T : Bar
{
}