Загадкой мне это: почему происходит неявная ошибка реализации интерфейса? - PullRequest
3 голосов
/ 27 октября 2011

Рассмотрим следующие строки кода:

public interface IProduct
{
    string Name { get; set; }
}

public interface IProductList
{
    string Name { get; }

    IProduct GetValueObject();
}

public abstract class BaseProductList<T> : IProductList where T : class, IProduct, new()
{
    public abstract T GetValueObject();

    public string Name { get; set; }
}

Это дает мне следующее предупреждение: Error 1 ConsoleApplication1.EnumTest.BaseProductList-T- does not implement interface member ConsoleApplication1.EnumTest.IProductList.GetValueObject(). ConsoleApplication1.EnumTest.BaseProductList-T-.GetValueObject() cannot implement ConsoleApplication1.EnumTest.IProductList.GetValueObject() because it does not have the matching return type of ConsoleApplication1.EnumTest.IProduct

(Ошибка 1 «ConsoleApplication1.EnumTest.BaseProductList» не реализовать интерфейсный элемент 'ConsoleApplication1.EnumTest.IProductList.GetValueObject ()'. 'ConsoleApplication1.EnumTest.BaseProductList.GetValueObject ()' не может реализовать ConsoleApplication1.EnumTest.IProductList.GetValueObject (), потому что у него нет соответствующего возвращаемого типа 'ConsoleApplication1.EnumTest.IProduct. \ Cencibel \ дома $ \ k.bakker \ визуальный студия 2010 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ EnumTest \ Program.cs 29 23 TestApp)

Но когда я добавляю этот явный фрагмент кода, он работает:

IProduct IProductList.GetValueObject()
{
    return GetValueObject();
}

Почему .Net не может понять это!?

1 Ответ

7 голосов
/ 27 октября 2011

Метод, возвращающий IProduct, равен , а не , такой же, как метод, возвращающий some-type-реализация- IProduct.Вы пытаетесь использовать ковариантные типы возвращаемых данных - которые .NET не поддерживает.

В основном это похоже на следующую ситуацию:

// Doesn't compile
class Foo : ICloneable
{
    public Foo Clone()
    {
        return new Foo();
    }
}

Хорошо выглядит и позволяет клиентам вызывать Clone() и возвращать строго типизированное значение - но он не реализует интерфейс.Это не поддерживается в .NET и никогда не было - универсальные элементы в вашем коде являются еще одним примером той же проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...