неявная реализация интерфейса
От: Visor2004  
Дата: 23.03.11 23:05
Оценка:
пытаюсь сделать кастом коллекцию:

 public class PresentationValueEntry : System.Collections.Generic.ICollection [ ValueSource ]
 {
  .......

    // С этим все нормально
    public GetEnumerator ( ) : IEnumerator [ ValueSource ]
    {
        sources.GetEnumerator ( );
    }
    
    // вот на это ругается
    GetEnumerator ( ) : System.Collections.IEnumerator implements System.Collections.IEnumerable.GetEnumerator
    {
        ( sources : System.Collections.IEnumerable ).GetEnumerator ( );
    }
 }


Текст ошибки:

attempted return type overload on method Workspace.Presentation.PresentationValueEntry.GetEnumerator() : System.Collections.IEnumerator and method Workspace.Presentation.PresentationValueEntry.GetEnumerator() : System.Collections.Generic.IEnumerator[Workspace.Presentation.ValueSource]


Что я делаю не так?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: неявная реализация интерфейса
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.03.11 23:52
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Что я делаю не так?


Дай второму методу другое имя.
Re: неявная реализация интерфейса
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.03.11 23:54
Оценка: 13 (2)
Здравствуйте, Visor2004, Вы писали:

V>
V>    // С этим все нормально
V>    public GetEnumerator ( ) : IEnumerator [ ValueSource ]
V>    ...
V>    // вот на это ругается
V>    GetEnumerator ( ) : System.Collections.IEnumerator implements System.Collections.IEnumerable.GetEnumerator
V>

V>Текст ошибки:
V>

V>attempted return type overload on method Workspace.Presentation.PresentationValueEntry.GetEnumerator() : System.Collections.IEnumerator and method Workspace.Presentation.PresentationValueEntry.GetEnumerator() : System.Collections.Generic.IEnumerator[Workspace.Presentation.ValueSource]

V>Что я делаю не так?

Из сообщения очевидно, что недопустимо иметь в одном типе два метода сигнатуры которых отличаются только лишь возвращаемым значением.

Собственно проблема решается простым переименованием метода явно реализующего интерфейс. Таким образом вместо:
GetEnumerator ( ) : System.Collections.IEnumerator implements System.Collections.IEnumerable.GetEnumerator

можно написать например:
GetEnumeratorNonGeneric() : System.Collections.IEnumerator implements System.Collections.IEnumerable.GetEnumerator

и все будет ОК.

Но на самом деле можно делать проще. Немерл поддерживает ковариантность при реализации интерфейсов. Так что можно просто удалить второй GetEnumerator() и компилятор использует первый (публичный) для реализации методов обоих интерфейсов (дженерик-интерфейса и обычного).

Так что в твоем случае можно просто грохнуть GetEnumerator().

ЗЫ

К сожалению, IDE не учитывает всех нюансов реализации интерфейсов и предлагает реализовать оба метода.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: неявная реализация интерфейса
От: Visor2004  
Дата: 24.03.11 02:16
Оценка:
Здравствуйте, VladD2, Вы писали:

Удален оверквотинг.

спасибо
Помните!!! ваш говнокод кому-то предстоит разгребать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.