2011-10-27 37 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

(錯誤1 'ConsoleApplication1.EnumTest.BaseProductList' 不 實現接口成員 「ConsoleApplication1 .EnumTest.IProductList.GetValueObject()'。 'ConsoleApplication1.EnumTest.BaseProductList.GetValueObject()' 無法實現 'ConsoleApplicat ion1.EnumTest.IProductList.GetValueObject()'因爲 它沒有匹配的返回類型 'ConsoleApplication1.EnumTest.IProduct'。 \ cencibel \家園$ \ k.bakker \視覺 工作室 2010 \項目\ ConsoleApplication1 \ ConsoleApplication1 \ EnumTest \的Program.cs 29 23 TestApp)

但當我添加此明確的一段代碼,它的工作原理:

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

爲什麼不能.Net圖這一個!?

回答

7

返回IProduct的方法是而不是與返回某種類型實現IProduct的方法相同。您正在嘗試使用.NET不支持的covariant return types

基本上它是一個類似這樣的情況:

​​

看起來不錯,並允許客戶端調用Clone(),並得到一個強類型的值 - 但它不會實現的接口。這在.NET中不被支持,並且從來沒有 - 代碼中的泛型只是另一個同樣問題的例子。

+0

哇......現在我知道當我試着和別人說西班牙語時感覺如何。爲我提供了一些閱讀材料? –

+0

@ KeesC.Bakker:編輯了一個鏈接到答案。基本上這不是專用於泛型 - 它只是一個功能(協變返回類型),一般不支持.NET,並且從來沒有。 –

+0

啊,沒關係,錯過了鏈接。 –

相關問題