Как мы должны реализовать default (T) в интерфейсах? - PullRequest
5 голосов
/ 30 августа 2011

Поместите default(T) в интерфейс. Явно реализует интерфейс.Результат не компилируется

public interface IWhatever<T>
{
   List<T> Foo(T BarObject = default(T));
}

public class ConcreteWhatever: IWhatever<ConcreteWhatever>
{
    List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(T)) {}
}

Я полностью ожидаю default(ConcreteWhatever).Я получаю default(T), что приводит к ошибке компиляции.

Я просто захожу и заменяю default(T) на null, и все в порядке.Но это отвратительно.Почему это происходит?

Ответы [ 3 ]

9 голосов
/ 30 августа 2011

У вас нет T в этом случае, потому что ConcreteWherever не является универсальным типом.

Если вы хотите default(ConcreteWhatever), то это код, который вы должны написать.

Вы просто жалуетесь на код, автоматически сгенерированный Visual Studio? Если это так, то это разумная жалоба, но стоило бы быть прямо об этом ... (Обратите внимание, что вы не используете явную реализацию интерфейса здесь - в противном случае она будет объявлена ​​как IWhatever<ConcreteWhatever>.Foo. на самом деле также не имеет должной неявной реализации, иначе она должна быть публичной ...)

РЕДАКТИРОВАТЬ: Я только что сам попробовал то же самое, и увидел тот же результат, за исключением того, что метод обнародован. Похоже, что это просто ошибка Visual Studio - я предлагаю вам создать запрос Connect . Я подозреваю, что это относительно редкая ситуация - создание универсального интерфейса, который задает необязательный параметр, который использует значение по умолчанию для параметра типа в качестве значения ...

2 голосов
/ 30 августа 2011

Не должна ли эта строка:

List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(T)) {}

быть:

List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(ConcreteWhatever)) {}
0 голосов
/ 30 августа 2011
public interface IWhatever<T>
{
    List<T> Foo(T BarObject = default(T));
}

public class ConcreteWhatever : IWhatever<ConcreteWhatever>
{
    public List<ConcreteWhatever> Foo(ConcreteWhatever BarObject = default(ConcreteWhatever))
    {
        return null; // replace with proper code
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...