它告訴我,該類型應該是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 { ... } };
}
感謝。我喜歡第二種方法。 IHasOperatingSystem接口的使用非常廣泛,因此使其通用會比我想要的更具有侵入性。儘管如此,我仍然有點模糊。會允許這個問題產生(即永遠不會被允許),還是僅僅因爲目前設計的東西而不允許? – Eric