gpt4 book ai didi

c# - 在 Dictionary 和 Dictionary 之间转换,其中 T1 :T3 Throws an Error

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

我有以下代码(名称仅供示例):

一些为我提供字典数据的函数:

public Dictionary<IMayor, SocialStatus> GetMayorSocialStatuses()
{
//Do Stuff
}

public Dictionary<IJanitor, SocialStatus> GetJanitorSocialStatuses()
{
//Do Stuff
}

然后我尝试将这些结果添加到 IPerson 类型的字典中。

IJanitorIMayor 都实现了 IPerson

假设我没有问题,我尝试执行以下操作:

public Dictionary<IPerson,SocialStatus> GetPersonsSocialStatuses()
{
var dict=new Dictionary<IPerson,S ocialStatus>();

foreach(var mayorKvp in GetMayorSocialStatuses())
{
dict.Add(mayorKvp.Key,mayorKvp.Value);
}

foreach(var janitorKvp in GetJanitorSocialStatuses())
{
dict.add(janitorKvp.Key,janitorKvp.Value);
}
}

工作起来很有魅力,但 foreach 看起来很恶心。

我尝试用这个扩展方法替换它们:

public static Dictionary<IPerson,SocialStatus> AddRange(
this Dictionary<IPerson,SocialStatus> dict,
Dictionary<IPerson,SocialStatus> inputDict)
{
foreach(var kvp in inputDict)
{
dict.add(kvp.Key,kvp.Value);
}

return dict;;
}

但在这样做时,我收到了一个编译错误,它无法从 IMayor,SocialStatus 类型的字典转换为 IPerson,SocialStatus

在调查这个问题后,我意识到由于一种称为“关闭泛型类型”的方式,它们是不可转换的,这意味着继承不会移动到字典并且无法进行转换。

问题是:那我该如何解决呢?

难道没有更简洁的方法吗?

(因为如果提供者不在同一个类/静态类中,我就完蛋了)

我没有绑定(bind)到特定版本的 .NET,因此任何解决方案都很好。

最佳答案

编译器错误是正确的——你不能将具体类型的字典(用一种键类型参数化)分配给另一个不同的(用其他键类型)——类型不匹配(如你提到的)。一种可能的解决方案是更改扩展方法参数以接受 IDictionary 作为参数。不幸的是,它也无济于事 - 因为接口(interface)是参数化不变的(convariance and contravariance)。

可能的解决方案:

public static Dictionary<IPerson, string> AddRange<TPerson>(
this Dictionary<IPerson, string> dict,
Dictionary<TPerson, string> inputDict)
where TPerson : IPerson
{
foreach (var kvp in inputDict)
{
dict.Add(kvp.Key, kvp.Value);
}

return dict;
}

关于c# - 在 Dictionary<T1,someEnum> 和 Dictionary<T3,someEnum> 之间转换,其中 T1 :T3 Throws an Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130999/

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