泛型中的逆变/协变问题

3

我正在尝试创建特定类的类型,但我无法将它们作为其通用表示返回,有人能告诉我如何实现吗?我对逆变/协变魔术有些陌生。

public DashboardNotification<IDashboardEntry> Get()
{
    //return new MyNotWorkingNotification(); // doesn't compile, I want to achieve this
    return new MyWorkingNotification(); // compiles
}

public class DashboardNotification<T> where T : IDashboardEntry
{
}

public interface IDashboardEntry
{
}

public class MyNotWorkingNotification : DashboardNotification<MyDashboardEntry>
{
}

public class MyWorkingNotification : DashboardNotification<IDashboardEntry>
{
}

public class MyDashboardEntry : IDashboardEntry
{
}
1个回答

6

让我们重新命名你的类型。

interface IAnimal {}
class Cage<T> where T : IAnimal {}
class Tiger : IAnimal {}

你的问题是:我有一个>,我希望它可以被用作>,因为老虎是一种动物。
现在你明白这为什么是不合法的了吗?老虎笼只能容纳老虎;动物笼可以容纳任何动物。如果老虎笼可以用作动物笼,那么你就可以把一条鱼放进老虎笼里,这既会让老虎也会让鱼很不开心。
你想要的是泛型类协变,但C#只支持接口和委托的泛型协变。

那么我们就同意这个方案,我需要一个这样的接口 IDashboardNotification<out T> where T : IDashboardEntry,这是唯一的解决方案吗? - Ruskin
1
@Ruskin:那是一种解决方案,但远非唯一的解决方案。首选的解决方案是:停止尝试在通用类型系统中捕获过多信息。它并不适用于表示复杂关系。看起来你正在尝试在类型系统中编码业务逻辑;不要这样做。 - Eric Lippert
以上示例中没有业务逻辑,所以我不确定你是如何推断出来的?此外,这不正是协方差被引入的原因吗...用于表示“复杂”的关系? - Ruskin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接