Я играл с методами расширения, чтобы добавить некоторые возможности к существующим интерфейсам. Когда я неявно реализую элементы интерфейса, компилятор выбирает реализацию члена интерфейса вместо метода расширения, как указано на странице this MSDN.Связывание метода расширения для явной реализации интерфейса
Однако, когда я пытаюсь выполнить явную реализацию, кажется, что вместо внедренного элемента интерфейса выбран метод расширения.
//My interface and extension method for this interface
interface IExt
{
void Extended(int e);
}
public static int Extended(this yapboz.IExt ext, int e)
{
return e + 1;
}
Когда я реализую данный расширенный метод явно (CExt ниже), он не связывается.
class CExt : IExt
{
void IExt.Extended(int e)
{
throw new NotImplementedException();
}
}
После этой реализации он возвращает целочисленное значение вместо того, чтобы выбрасывать исключение!
Однако, когда я реализую элемент интерфейса неявно (см. Ниже), тогда мой код генерирует исключение.
class CExt : IExt
{
public void Extended(int e)
{
throw new NotImplementedException();
}
}
Это никогда не сработает. Тип распознавателя будет использовать метод на вашем интерфейсе, прежде чем он проверяет, существует ли метод расширения. Удалите этот метод из вашего интерфейса. –
@MatthewWhited Я думаю, что OP говорит о создании объекта 'CExt' и вызывает' Extended' на том, что вызовет метод расширения, потому что интерфейс явно реализован. – juharr
@MatthewWhited Интересно, почему неявные и явные реализации имеют такую разницу? Для неявного случая это так, как я ожидал, и вызывает метод-член, но для явного случая он предпочитает метод расширения? – Deniz