gpt4 book ai didi

c# - 当方法具有 IDictionary 和 IDictionary 的重载时调用不明确

转载 作者:太空狗 更新时间:2023-10-29 21:09:29 26 4
gpt4 key购买 nike

当一个方法有两个重载时,一个接受 IDictionary 另一个接受 IDictionary<TKey, TValue> ,将 new Dictionary<string, int>() 传递给它被认为是不明确的。但是,如果将两个重载更改为接受 IEnumerableIEnumerable<KeyValuePair<TKey, TValue>> ,则调用不再有歧义。

As Dictionary<TKey, TValue> implements all of the above interfaces (to be precise, IDictionary<TKey, TValue> , ICollection<KeyValuePair<TKey, TValue>> , IDictionary , ICollection , IReadOnlyDictionary<TKey, TValue> , IReadOnlyCollection<KeyValuePair<TKey, TValue>> , IEnumerable<KeyValuePair<TKey, TValue>> , IEnumerable , ISerializable , IDeserializationCallback in .NET 4.5);由于 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)'

问题一:为什么会这样?

问题 2:如果一个类同时实现了泛型和非泛型参数,如何在不引起歧义的情况下同时接受泛型和非泛型参数?

最佳答案

C# 将调用最具体的可用重载。识别 IEnumerable<T> 没有问题比 IEnumerable 更具体因为IEnumerable<T>延伸IEnumerable .然而,IDictionary<T, U> 扩展IDictionary ,所以即使Dictionary<T, U>实现两者,编译器无法识别哪个更具体。对于编译器,这些也可能是完全不相关的接口(interface)。

您必须使用显式转换给编译器一个提示:

FooDic((IDictionary)dic); // not ambiguous
FooDic((IDictionary<string, int>)dic); // not ambiguous

关于c# - 当方法具有 IDictionary 和 IDictionary<TKey, TValue> 的重载时调用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197715/

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