2014-07-16 106 views
1

爲什麼我不能這樣做?使用實現所需返回類型的返回類型實現接口

IHasOperatingSystem { 
IOperatingSystem OperatingSystem { get; } 
} 

Computer<T> : IHasOperatingSystem where T : IOperatingSystem { 
public T OperatingSystem { get; } 
} 

它告訴我,該類型應該是IOperatingSystem,但是如果T實現IOperatingSystem,應該不夠嗎?

此外,我意識到這個問題的標題可能有點混淆,但我想不出一個更好的方式來描述它。

回答

6

它告訴我,該類型應該是IOperatingSystem,但是如果T實現IOperatingSystem,應該不夠嗎?

不,這只是C#的工作方式。爲了實現接口或覆蓋方法,參數類型和返回類型必須與完全匹配。從C#5規範的章節13.4.4:

對於接口映射的目的,類部件A時的接口部件B相匹配:

  • A和B是方法,以及名稱,類型和形式參數列表A和B是相同的。
  • ...

(這裏的 「類型」 應讀爲 「返回類型」)

現在你可以讓你的IHasOperatingSystem型通用的,當然:

public interface IHasOperatingSystem<T> where T : IOperatingSystem 
{ 
    T OperatingSystem { get; } 
} 

public class Computer<T> : IHasOperatingSystem<T> where T : IOperatingSystem 
{ 
    public T OperatingSystem { get { ... } } 
} 

或者您也可以使用Computer<T>類中的顯式接口實現:

public interface IHasOperatingSystem 
{ 
    IOperatingSystem OperatingSystem { get; } 
} 

public class Computer<T> : IHasOperatingSystem where T : IOperatingSystem 
{ 
    // Explicit interface implementation... 
    IHasOperatingSystem.OperatingSystem IOperatingSystem 
    { 
     // Delegate to the public property 
     get { return OperatingSystem; } 
    } 

    public T OperatingSystem { get { ... } }; 
} 
+0

感謝。我喜歡第二種方法。 IHasOperatingSystem接口的使用非常廣泛,因此使其通用會比我想要的更具有侵入性。儘管如此,我仍然有點模糊。會允許這個問題產生(即永遠不會被允許),還是僅僅因爲目前設計的東西而不允許? – Eric

2

如果T實現IOperatingSystem,應該不夠嗎?

即使它在其他語言(斯卡拉,我認爲)可能是足夠的,在C#中,它不是。返回類型是不變的(除了委託返回類型,which are covariant)。

一種用於這些情況下常見的解決方法是使用泛型,因爲這樣的:

IHasOperatingSystem<T> where T: IOperatingSystem 
{ 
    T OperatingSystem { get; } 
} 

Computer<T> : IHasOperatingSystem <T> where T : IOperatingSystem 
{ 
    public T OperatingSystem { get; } 
} 
相關問題