gpt4 book ai didi

c# - IDictionary<,> 逆变?

转载 作者:可可西里 更新时间:2023-11-01 03:07:51 25 4
gpt4 key购买 nike

我在外部类中有以下方法

public static void DoStuffWithAnimals(IDictionary<string, Animal> animals)

在我的调用代码中,我已经有一个 Dictionary<string, Lion>对象,但我不能将其作为此方法的参数传递。所以一个IDictionary<,>不是逆变的吗?我看不出为什么这不起作用。

我能想到的唯一解决办法是:

var animals = new Dictionary<string, Animal>();

foreach(var kvp in lions) {
animals.Add(kvp.Key, kvp.Value);
}

有没有办法将这个字典传递给这个方法,而不必创建相同对象的新字典?


编辑:

因为这是我的方法,我知道我从字典中使用的唯一成员是 TValue this[TKey key] 的 setter/getter 。 ,它是 IDictionary<TKey, TValue> 的成员,所以在这种情况下,我无法为参数使用“更宽”的类型。

最佳答案

首先,C# 中的协变和逆变仅适用于接口(interface)和委托(delegate)。

所以你的问题实际上是关于 IDictionary<TKey,TValue> .

除此之外,最简单的做法是记住,如果一个类型参数的所有值要么只传入,要么只传出,那么接口(interface)只能是协变/反变的。

例如(逆变):

interface IReceiver<in T> // note 'in' modifier
{
void Add(T item);
void Remove(T item);
}

和(协方差):

interface IGiver<out T> // note 'out' modifier
{
T Get(int index);
T RemoveAt(int index);
}

IDictionary<TKey,TValue> 的情况下,两种类型参数都用于 inout容量,这意味着接口(interface)不能是协变或逆变的。它是不变的。

然而,类 Dictionary<TKey,TValue> 执行 IEnumerable<T> 这是协变的。

一个很好的引用是:

https://learn.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance

关于c# - IDictionary<,> 逆变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12841458/

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