協變性和逆變性
阿新 • • 發佈:2017-06-05
spa call some log all other 分割 基類 eth
1、協變性是指方法能返回從委托的返回類型派生的一個類型。
2、逆變性是指方法獲取的參數可以是委托的參數類型的基類。
=================================分割線=================================
delegate Object MyCallback(FileStream s);
string SomeMethod(Stream s);
如上面的例子,SomeMethod 的返回類型(string)派生自委托的返回類型(Object);這種協變性是允許的。SomeMethod 的參數類型(Stream)是委托的參數類型(FileStream)的基類;這種逆變性是允許的。
=================================分割線=================================
註意:只有引用類型才支持協變性與逆變性,值類型或void不支持。所以不能把下面的方法綁定到MyCallBack委托:
int SomeOtherMethod(Stream s);
雖然 SomeOtherMethod 的返回類型(int)派生自MyCallback的返回類型(Object),但這種形式的協變性是不允許的,因為int是值類型。顯然,值類型和void之所以不支持,是因為它們的存儲結構是變化的,而引用類型的存儲結構始終是一個指針。
協變性和逆變性