Если у меня есть 2 метода с тем же именем, но с разными типами возврата. Они наследуются классом из двух интерфейсов. Этот класс может обеспечить 1 реализацию для обоих, если тип возврата для реализации соответствует типу возврата в обоих интерфейсах.То же имя в двух методах в двух разных интерфейсах, почему бы не реализовать 1?
Например, String
тип реализует оба метода: IEnumerable
и IEnumerable<char>
. Реализация для типа String
содержит только одну реализацию для GetEnumerator
.
public CharEnumerator GetEnumerator();
Я считаю, что это возможно, потому что CharEnumerator
реализует как IEnumerator
и IEnumerator<char>
public CharEnumerator: IEnumerator, IEnumerator<char>
Однако, подобный код в моем приложении ниже дает мне ошибку компиляции,
interface Ia { IEnumerator o();}
interface Ib { IEnumerator<int> o();}
class e : IEnumerator, IEnumerator<int>{}
class c : Ia, Ib { public e o() { return new e(); } }
Если я сделайте F12 по типу String в Visual Studio, я вижу что-то вроде ниже,
Как вы можете видеть, есть только одна неявная реализация GetEnumerator()
, нет явных реализаций там
C# язык не поддерживает тип возвращаемого значения ковариационной , Вот почему класс String имеет * два метода GetEnumerator(). Второй - это явный метод реализации, необходимый для избежания двусмысленности. И почему вам нужны и два. –
@HansPassant Я думаю * оба интерфейса реализованы явно. 'string.GetEnumerator' фактически возвращает' CharEnumerator', который не будет соответствовать ни одному из двух интерфейсных контрактов. Я предполагаю, что это устаревший код из C# 1 – InBetween
@HansPassant Почему тогда мой код не скомпилирован, тип 'e' происходит от' IEnumerable', а также 'IEnumerable <>' – EagerToLearn