Cast Derived to Base字典

时间:2015-10-12 16:05:21

标签: c# dictionary

我有2个词典。如何将DerivedClass字典分配给DerivedClass字典?

下面的代码没有问题?

如何更改?

public class BaseClass
{
    public void DoWork() { }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}


class Program
{
    static void Main(string[] args)
    {
        var derivedclass = new Dictionary<string, DerivedClass>();
        var baseClass = new Dictionary<string, BaseClass>();

        Dictionary<string, BaseClass> AAA = derivedclass;


        Console.ReadKey();
    }
}

2 个答案:

答案 0 :(得分:2)

你不能直接施放字典,但你可以创建一个新的字典,这样的东西可以工作:

Dictionary<string, BaseClass> AAA = 
    derivedclass.ToDictionary(
        k => k.Key, 
        v => (BaseClass)v.Value);

答案 1 :(得分:1)

你做不到。 Dictionary(以及C#中的所有类)在其泛型参数方面是不变的。

即使C#工作以支持类上的泛型类型方差(而不仅仅是接口和委托),Dictionary在概念上对于字典值的类型也不是不变的。您可以向字典中添加新值,因此如果您可以将Dictionary<int, Tiger>强制转换为Dictionary<int, Animal>,那么您可以将Chicken放入该老虎字典中,我们都知道这有多好会结束。

如果你有一个IReadOnlyDictionary接口,它可能在值的类型方面是协变的,尽管.NET实现不是。