问题
using System.Collections.Generic;
using System.Linq;
给定一个基类和 2 个派生类:
class Base{}
class Derived0 : Base{}
class Derived1 : Base{}
我有两个类型的字典:
IDictionary<String, Derived0> d0 = ...;
IDictionary<String, Derived1> d1 = ...;
我想找到两个字典的并集,它应该有 type IDictionary<String, Base>
。(我已经知道两个字典中的键是唯一的,所以我不关心重复时的行为。)
尝试
如果它们是同一类型,我可以使用
var union = d0.Concat(d1);
但这会产生错误(使用编译dmcs
):
Test.cs(15,20): error CS0411: The type arguments for method `System.Linq.Queryable.Concat<TSource>(this System.Linq.IQueryable<TSource>, System.Collections.Generic.IEnumerable<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly
如果我明确给出Base
作为类型参数:
IDictionary<string, Base> union = d0.Concat<Base>(d1);
它仍然不起作用:
Test.cs(15,42): error CS1928: Type `System.Collections.Generic.IDictionary<string,Derived0>' does not contain a member `Concat' and the best extension method overload `System.Linq.Enumerable.Concat<Base>(this System.Collections.Generic.IEnumerable<Base>, System.Collections.Generic.IEnumerable<Base>)' has some invalid arguments
/usr/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll (Location of the symbol related to previous error)
Test.cs(15,42): error CS1929: Extension method instance type `System.Collections.Generic.IDictionary<string,Derived0>' cannot be converted to `System.Collections.Generic.IEnumerable<Base>'
原则上,方差在这里应该无关紧要,因为我正在创建一个新的字典对象,但我不知道如何在类型系统中表示它。