2016-03-11 3 views
0

Я играл с методами расширения, чтобы добавить некоторые возможности к существующим интерфейсам. Когда я неявно реализую элементы интерфейса, компилятор выбирает реализацию члена интерфейса вместо метода расширения, как указано на странице 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(); 
    } 
} 
+2

Это никогда не сработает. Тип распознавателя будет использовать метод на вашем интерфейсе, прежде чем он проверяет, существует ли метод расширения. Удалите этот метод из вашего интерфейса. –

+0

@MatthewWhited Я думаю, что OP говорит о создании объекта 'CExt' и вызывает' Extended' на том, что вызовет метод расширения, потому что интерфейс явно реализован. – juharr

+0

@MatthewWhited Интересно, почему неявные и явные реализации имеют такую ​​разницу? Для неявного случая это так, как я ожидал, и вызывает метод-член, но для явного случая он предпочитает метод расширения? – Deniz

ответ

3

Явные реализации должны быть вызваны через интерфейс. Так

IExt c = new CExt(); 
c.Extended(1); 

связывается с явным интерфейсом implementaion, так как переменная типа интерфейса, но

CExt c = new CExt(); 
c.Extended(1); 

связывается с методом расширения, так как нет никакого общественного Extended метод на самом CExt типа ,

Это , почему ведет себя так, Однако я хотел бы отметить, что не рекомендуется добавлять методы расширения, аналогичные существующим методам интерфейса. Методы расширения используются для . Расширяют интерфейсы и классы, а не добавляют реализацию к существующему интерфейсу.