2011-10-27 2 views
3

Рассмотрим следующие строки кода:Загадка меня: почему возникает ошибка реализации неявного интерфейса?

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

(Error 1 'ConsoleApplication1.EnumTest.BaseProductList' не реализации элемента интерфейса «ConsoleApplication1 .EnumTest.IProductList.GetValueObject() '. ' ConsoleApplication1.EnumTest.BaseProductList.GetValueObject() ' не может реализовать ' ConsoleApplicat ion1.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 фигуры это один из !?

ответ

7

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

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

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

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

+0

Ух ты ... теперь я знаю, что мне нравится, когда я пытаюсь поговорить с кем-то по-испански. Есть ли у меня материал для чтения? –

+0

@ KeesC.Bakker: отредактировал ссылку в ответ. В основном это не относится к дженерикам - это всего лишь функция (ковариантные типы возврата), которая вообще не поддерживается .NET и никогда не была. –

+0

Ах, правда, пропустил ссылку. –

Смежные вопросы