11
Covariance, Contravariance 觀觀觀觀 Howard

Covariance, contravariance 觀念分享

Embed Size (px)

DESCRIPTION

Covariance, contravariance 觀念分享

Citation preview

Page 1: Covariance, contravariance 觀念分享

Covariance, Contravariance 觀念分享

Howard

Page 2: Covariance, contravariance 觀念分享

Covariance

string[] strings = new string[3];object[] objects = strings;

objects[0] = DateTime.Now; string s = (string)objects[0];

// RunTimeError !! 發生 ArrayTypeMismatchException!

Page 3: Covariance, contravariance 觀念分享

Covariance – generic types

List<string> stringList = new List<string>();List<object> objectList = stringList;

Cannot implicitly convert type 'System.Collections.Generic.List<string>' to 'System.Collections.Generic.List<object>’

泛型本身具有不變性( invariance)

Page 4: Covariance, contravariance 觀念分享

Covariance in .Net 4.0

List<string> stringList = new List<string>();

// C# 2/3 不允許, C# 4.0 OK!IEnumerable<object> objects = stringList;

WHY ?

Page 5: Covariance, contravariance 觀念分享

Covariance in .Net 4.0

public interface IEnumerable<out T> : Ienumerable{

IEnumerator<T> GetEnumerator();}

型別 T 在這個泛型介面中只能用於 method 的傳回值,而不能用來 當作 method 的參數

public interface IFoo<out T>{

// 編譯失敗:型別 T 在這裡只能用於方法的傳回值,不可當作參數。

string Convert(T obj); T GetInstance(); // OK!

}

Page 6: Covariance, contravariance 觀念分享

Covariance in .Net 4.0

用 IEnumerable<T> 把一串物件包起來,難道不會跟 前面的陣列 covariance 範例一樣產生型別安全的問題

嗎?

答案是不會。因為 IEnumerable<T> 的操作都是唯讀的,你無法透過它去替換或增刪串列中的元素。

Page 7: Covariance, contravariance 觀念分享

Contravariance

跟 Covariance 相反 - in

static object GetObject() { return null; }static void SetObject(object obj) { }static string GetString() { return ""; }static void SetString(string str) { }

static void Test(){ // Covariance. A delegate specifies a return type as object, // but you can assign a method that returns a string. Func<object> del = GetString;

// Contravariance. A delegate specifies a parameter type as string, // but you can assign a method that takes an object.

Action<string> del2 = SetObject;}

Page 8: Covariance, contravariance 觀念分享

Contravariance

public interface MyIComparer<in Tin> {

int Compare(Tin left, Tin right); }

Page 9: Covariance, contravariance 觀念分享

結論

In .NET Framework 4, both C# and Visual Basic support covariance and contravariance in generic interfaces and delegates and allow for implicit conversion of generic type parameters.

Page 10: Covariance, contravariance 觀念分享

Reference

C# 4.0: Covariance 與 Contravariance 觀念入門 http://huan-lin.blogspot.com/2009/10/c-

40covariance-and-contravariance.html

Covariance and Contravariance (C# and Visual Basic) http://msdn.microsoft.com/en-us/library/

ee207183.aspx

Page 11: Covariance, contravariance 觀念分享

Q & A