当一个方法有两个重载,一个接受IDictionary
和另一个接受IDictionary<TKey, TValue>
时,传递new Dictionary<string, int>()
给它被认为是模棱两可的。但是,如果将两个重载更改为 acceptIEnumerable
和IEnumerable<KeyValuePair<TKey, TValue>>
,则调用不再模棱两可。
AsDictionary<TKey, TValue>
实现上述所有接口(准确地说,.NET 4.5 中的 ,IDictionary<TKey, TValue>
, ICollection<KeyValuePair<TKey, TValue>>
, IDictionary
, ICollection
, IReadOnlyDictionary<TKey, TValue>
, IReadOnlyCollection<KeyValuePair<TKey, TValue>>
, IEnumerable<KeyValuePair<TKey, TValue>>
, IEnumerable
, );继承自和继承自,我不明白为什么会发生这种情况。ISerializable
IDeserializationCallback
IDictionary
IEnumerable
IDictionary<TKey, TValue>
IEnumerable<KeyValuePair<TKey, TValue>>
示例控制台应用程序:
using System;
using System.Collections;
using System.Collections.Generic;
namespace AmbigousCall
{
internal class Program
{
static void Main (string[] args)
{
var dic = new Dictionary<string, int>();
FooDic(dic); // Error: The call is ambiguous
FooEnum(dic); // OK: The generic method is called
Console.ReadKey();
}
static void FooDic (IDictionary dic) {}
static void FooDic<TKey, TValue> (IDictionary<TKey, TValue> dic) {}
static void FooEnum (IEnumerable dic) {}
static void FooEnum<TKey, TValue> (IEnumerable<KeyValuePair<TKey, TValue>> dic) {}
}
}
我得到的错误是:以下方法或属性之间的调用不明确:'AmbigousCall.Program.FooDic(System.Collections.IDictionary)'和'AmbigousCall.Program.FooDic(System.Collections.Generic.IDictionary)'
问题1:为什么会这样?
问题 2:如果一个类同时实现了泛型和非泛型参数,那么如何同时接受泛型和非泛型参数而不引起歧义?