gpt4 book ai didi

c# - "Generic"类型参数/类型参数中的继承

转载 作者:行者123 更新时间:2023-11-30 13:46:35 26 4
gpt4 key购买 nike

假设我有一个函数

DoSomething(Dictionary<object, object> dict)

为什么不能调用

DoSomething(new Dictionary<int, string>())

intstring都继承自 object ,我希望这能奏效。我知道我可以将其扩展到

DoSomething<T1, T2>(Dictionary<T1, T2> dict)

,但为什么第一个选项不起作用?

最佳答案

这是因为一个Dictionary<int, string>不是 Dictionary<object, object> .

要实现这一点,类类型 Dictionary<TKey, TValue>TKey 中都需要协变和 TValue ,并且协方差需要与值类型一起使用(装箱)。

首先,在 .NET 中,泛型 class 类型总是不变的。只有接口(interface)类型和委托(delegate)类型可以协变或逆变。

其次,Dictionary<,>不是语义协变的。例如你可以说:

myDict.Add(new Elephant(), new BankCustomer());

如果 myDict 那可不是很愉快实际上是一个(运行时)Dictionary<int, string>Dictionary<object, object>变量。

现在,自 .NET 4.5 以来,一些“非字典”类型实现协变接口(interface),如 IReadOnlyList<out T> .您可能希望类似的界面 IReadOnlyDictionary<TKey, TValue>也是协变的。但事实并非如此(下面 Servy 的第一条评论给出了原因)。所以你没有希望了。

关于c# - "Generic"类型参数/类型参数中的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20614739/

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