gpt4 book ai didi

c# - 通用类 : no implicit reference conversion 的通用函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:35 26 4
gpt4 key购买 nike

我正在尝试通过引入通用函数来清理一些重复的代码块。但我没有设法这样做,我感觉我的类继承结构变得比我试图清理的代码更困惑......

以下是所涉及类的抽象概述:

接口(interface):

interface Ia
interface Ib : Ia
interface Ic : Ib

类:

class Ca<T> where T : Ia
class Cb<T> : Ca<T> where T : Ia
class Cc : Cb<Ic>

功能:

void F<T>(T t) where T : Ca<Ib>

无效的函数调用:

F<Cc>(my_c);

错误:

The type 'Cc' cannot be used as type parameter 'T' in the generic type or method 'F<T>(T)'. There is no implicit reference conversion from 'Cc' to 'Ca<Ib>'.

我猜错误中的“隐含”一词指的是没有 where T : Ib 的事实在类定义中。所以我又加了一个类

class Cb2<T> : Cb<T> where T : Ib

并制作了Cc继承自 Cb2而不是 Cb .但这导致了同样的错误。

谁能解释为什么这是受限的,我该如何解决?

谢谢!

最佳答案

一般来说,C# 不允许泛型参数替换,即使它们是继承的类。这在 variance 时改变了添加了修饰符。

您需要的是协变性,它可以使用派生类型代替泛型参数。但是方差修饰符仅适用于接口(interface)和委托(delegate),因此 CaCbCc 应该是允许这样做的接口(interface)。你能得到的最接近它的是:

interface Ia {}
interface Ib : Ia {}
interface Ic : Ib {}

interface Ca<out T> where T : Ia {}
interface Cb<out T> : Ca<T> where T : Ia {}
interface Cc : Cb<Ic> {}

class Main
{
void F<T>(T t) where T : Ca<Ib>
{}

void M()
{
F<Cc>(null);
}
}

注意 CaCb 定义中的 out T

More about out modifier

关于c# - 通用类 : no implicit reference conversion 的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31698283/

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