【问题标题】:cast between Dictionary<T1,someEnum> and Dictionary<T3,someEnum> where T1:T3 Throws an Error在 Dictionary<T1,someEnum> 和 Dictionary<T3,someEnum> 之间转换,其中 T1:T3 引发错误
【发布时间】:2015-03-23 17:41:43
【问题描述】:

我有以下代码(名称仅用于示例目的):

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

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

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

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

没有更干净的方法吗?

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

我没有绑定到特定版本的 .NET,所以任何解决方案都会很棒。

【问题讨论】:

    标签: c# .net generics dictionary collections


    【解决方案1】:

    编译器错误是正确的-您不能将具体类型的字典(使用一种类型的键参数化)分配给另一个不同的(使用其他键类型)-类型不匹配(如您所述)。 一种可能的解决方案是更改扩展方法参数以接受 IDictionary 作为参数。不幸的是,它也无济于事 - 因为接口是参数化不变的 (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;
    }
    

    【讨论】:

    • 很好的答案!像魅力一样工作!
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 2020-01-09
    • 2011-12-03
    • 2021-08-22
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多