gpt4 book ai didi

c# - 具有继承和接口(interface)的泛型 - 为什么这不起作用?

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

这是我的整个应用程序。对我来说,这应该可以正常编译。

namespace SampleApp
{
interface I<T> where T : Image
{
}

class A<T> where T : Image
{
}

class B : A<Bitmap>, I<Bitmap>
{
}

class C : A<Metafile>, I<Metafile>
{
}

class Program
{
public static I<Image> SomeProperty { get; set; }

static void Main(string[] args)
{
B b = new B();
SomeProperty = b;

C c = new C();
SomeProperty = c;
}
}
}

但是,“SomeProperty = b”和“SomeProperty = c”行给出错误:

Cannot implicitly convert type 'B' to 'I<System.Drawing.Image>'. An explicit conversion exists (are you missing a cast?)

但我不知道为什么。 B 工具 I<Bitmap> , 并且 Bitmap 是 Image 的子类,所以根据定义,B 确实实现了 I<Image> .

最佳答案

正如 Sasha 所说,您正在寻找泛型协方差。这可能合适也可能不合适,具体取决于您的接口(interface)成员的外观。如果您只从接口(interface)中“取出”值,则可以通过使 T 协变来编译代码:

interface I<out T> where T : Image
{
}

但是,如果您有任何方法接受 T,例如

void ReplaceWith(T newImage)

那么你不能使 T 协变。

一般方差是一个复杂的话题 - 我在 NDC 2010 上做了一个演讲,您可能会发现它很有用。您可以在NDC video site观看。 .搜索“方差”以快速找到它。 (真正的内容大约从 2 分钟开始。)

关于c# - 具有继承和接口(interface)的泛型 - 为什么这不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4943901/

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