1. 程式人生 > >協變性和逆變性

協變性和逆變性

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之所以不支持,是因為它們的存儲結構是變化的,而引用類型的存儲結構始終是一個指針

協變性和逆變性