當我們在C#4.0中定義接口時,我們可以將每個通用參數標記爲in
或out
。如果我們試圖設置一個泛型參數並導致問題,編譯器會提出一個錯誤,而不允許我們這樣做。C#4.0中的協變和逆變推斷
問:
如果編譯器推斷的方法有哪些兩個covariance
(out
)和contravariance
(in
)有效的用途,爲什麼我們必須標記接口,這樣的?僅僅讓我們像往常一樣定義接口是不夠的,當我們試圖在我們的客戶代碼中使用它們時,如果我們試圖以不安全的方式使用它們,會引發錯誤?
例子:
interface MyInterface<out T> {
T abracadabra();
}
//works OK
interface MyInterface2<in T> {
T abracadabra();
}
//compiler raises an error.
//This makes me think that the compiler is cappable
//of understanding what situations might generate
//run-time problems and then prohibits them.
此外,
是不是什麼Java那樣在同樣的情況?從我記得,你只是做一些像
IMyInterface<? extends whatever> myInterface; //covariance
IMyInterface<? super whatever> myInterface2; //contravariance
或者我混合的東西?
感謝
我認爲他的第二個問題更像是「C#的變異註釋與Java的通配符類型有什麼不同?」 – Gabe 2010-04-29 00:29:46
@加貝:C#做*聲明網站*方差。 Java不會* call-site *方差。呼叫站點差異確實是一個有趣的想法,但讓我感到奇怪的是,根據特定站點上的使用方式,將類型變爲變體,而不是如何定義其行爲。 – 2010-04-29 00:37:18
是的,我現在明白了Java使用的問題。它的好處是不需要將接口參數聲明爲in或out,但是現在有些客戶端可能會立即給它一些使用權,如果我計劃更新接口,那麼以後可能不會被使用。 – 2010-04-29 00:42:27