Я не понимаю, почему компилятор не может решить правильную перегрузку для использования здесь. (код ниже) Существует только одна версия Add(), которая подходит - BigFoo является IFoo и не реализует IEnumerable, где T является IFoo. Но он настаивает на том, чтобы сообщать о двусмысленности. Есть идеи? Я попытался добавить второй общий тип параметра - Добавить где T: IFoo, где U: IEnumerable. Но тогда перегрузка полностью игнорируется даже для законного использования.C# общая перегрузка - компилятор не может определить правильный вызов
Я знаю, что могу обойти это с помощью литья и определения параметров типового типа, но в этот момент я победил цель перегрузки. Вы можете подвергнуть сомнению перегрузку, но семантика мне кажется верной - поведение, которое я реализую в своем классе, используется как для Add(), так и для добавления объекта в качестве отдельной записи в коллекции. (Второй Add() не должен быть AddRange().)
namespace NS
{
interface IFoo { }
class BigFoo : IFoo, IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
class FooContainer
{
public void Add(IFoo item) { }
public void Add<T>(IEnumerable<T> group) where T : IFoo { }
}
class DemoClass
{
void DemoMethod()
{
BigFoo bigFoo = new BigFoo();
FooContainer fooContainer = new FooContainer();
// error CS0121: The call is ambiguous between the following methods or properties:
// 'NS.FooContainer.Add(NS.IFoo)' and
// 'NS.FooContainer.Add<int>(System.Collections.Generic.IEnumerable<int>)'
fooContainer.Add(bigFoo);
}
}
}
Джефф Рихтер согласен «компилятор С # предпочитает более явное совпадение по родовым матч» Display («Jeff») будет соответствовать Display (String) над дисплеем (T) только –
Gishu
законсервированным нарушением правил применяется, если формальные типы параметров ИДЕНТИФИКАЦИЯ. Например, если у вас есть M (int x) и M (T t), то первый лучше, чем M (int t). –
Ах, спасибо Эрик. Хорошо иметь спецификацию онлайн и вносить свой вклад;) Будет правильно отредактировать. –