如果型別約束保證 T 實作了 IParameter,為什么我不能以 T 作為引數來實作 IMain 的方法?
interface IMain
{
void Method(IParameter parameter);
}
interface IParameter
{
}
class Implementation<T> : IMain where T : IParameter
{
//public void Method(IParameter parameter) { }//accepted implementation
public void Method(T parameter) { }//leaves the class with a "does not implement member..." compiler error
}
uj5u.com熱心網友回復:
如果型別約束保證 T 實作了 IParameter,為什么我不能以 T 作為引數來實作 IMain 的方法?
讓我們暫時假設這是合法的,看看在這種情況下會發生什么。
假設,我們有兩個類實作IParameter:
class Param1 : IParameter { }
class Param2 : IParameter { }
然后,我們創建以下物件:
var p1 = new Implementation<Param1>();
此時,p1.Method只會采用 type 的引數Param1。所以,嘗試做這樣的事情是行不通的:
p1.Method(new Param2()); // This is illegal, as expected.
現在,讓我們p1再試IMain一次:
var asIMain = (IMain)p1;
asIMain.Method(new Param2()); // What should happen here?!
一方面,我們有IMainwhoMethod接受一個IParameter引數,所以它應該允許一個Param2物件。但另一方面,底層型別asIMain是Implementation<Param1>whoMethod只接受一個Param1引數。編譯器足夠聰明,可以防止這種情況發生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510477.html
標籤:C#仿制药
