gpt4 book ai didi

c# - 将通用实例转换为基类

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:15 24 4
gpt4 key购买 nike

我正在尝试尝试诸如

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 时的功能,而不是任何派生版本的功能。有更好的方法吗?

最佳答案

您尝试使用的概念是协方差(关于 MSDN 的完整解释)

简短的回答是,您需要使用 out 标记您的通用参数;但是您只能在接口(interface)上执行此操作(在您的情况下从抽象类更改)。此外,根据您的方法参数和返回值,您可能无法将接口(interface)标记为协变。

interface Temp<out T> where T : Bar
{

}

关于c# - 将通用实例转换为基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41474970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com