標籤:style blog http color 使用 ar art div 問題
1,匿名方法
C#為委託提供一種機制,可以為委託定義匿名方法,匿名方法沒有名稱,編譯器會定指定一個名稱
匿名方法中不能使用跳躍陳述式跳轉到該匿名方法的外部,也不能跳轉到該方法的內部。
也不能在匿名方法外部使用的ref和out參數
public class A { } //B繼承自A public class B : A { } class Program { //委託的傳回型別是A public delegate A MyDelegate(); static void Main(string[] args) { //向委託添加方法Method MyDelegate my = Method; //方法Method的傳回型別可以派生於委託定義的傳回型別,這就是協變 my(); //※,如果將委託的傳回型別,和Method方法的傳回型別互換,就會產生編譯錯誤 } //方法返回一個子類B的類型,B繼承自A static B Method() { return new B(); } }
2,匿名方法的【λ(拉姆達)運算式】方式定義
C#3.0之後匿名方法可以使用λ運算式來進行定義
無論是拉姆達(lambda)運算式(事實上應該叫匿名函數)或是匿名類,都能歸屬到一種叫閉包的東西上面。
λ運算子 =>
左邊是參數,使用括弧表達 (string param),可以是 (param)這樣不定義類型,編譯器會推斷出來,只有一個參數的時候可以不使用括弧
右邊是實現代碼,使用花括弧,如果代碼只有一行,則不使用花括弧和return關鍵字也可以,編譯器會為我們添加
這是λ運算式的簡單實現
string str1 = " 匿名方法外部 ";
string str2 = " 匿名方法內部 ";
MyDelagate my = param => param + str1 + str2;
Console.WriteLine(my(" 參數 "));
3,委託調用過程的協變和抗變
關於委託的傳回型別和委託方法的參數傳遞,如果我們不能正確使用的時候,經常會發生“協變和抗變”的錯誤。
需要額外注意
傳回型別:傳回型別需要注意的是協變
方法的傳回型別可以派生於委託定義的類型。
參數類型:參數類型需要注意的是抗變
向委託傳遞的參數類型可以派生於委託方法的參數類型
傳回型別的協變
public class A { } //B繼承自A public class B : A { } class Program { //委託的傳回型別是A public delegate A MyDelegate(); static void Main(string[] args) { //向委託添加方法Method MyDelegate my = Method; //方法Method的傳回型別可以派生於委託定義的傳回型別,這就是協變 my(); //※,如果將委託的傳回型別,和Method方法的傳回型別互換,就會產生編譯錯誤 } //方法返回一個子類B的類型,B繼承自A static B Method() { return new B(); } }
參數類型的抗變
public class A { } //B繼承自A public class B : A { } class Program { //委託的傳回型別是A public delegate void MyDelegate(B b); static void Main(string[] args) { //向委託添加方法Method MyDelegate my = Method; //向委託傳遞的參數的類型可以派生於委託方法的參數類型,這就是抗變 my(new B()); //※,如果將委託的參數的類型,和Method方法的參數的類型互換,就會產生編譯錯誤 } //方法返回一個子類B的類型,B繼承自A static void Method(A a) { } }
//實際上繼承自A的類型B的執行個體可以轉化為A,而子類向父類轉化的過程,在預設情況下會有編譯錯誤
//如下代碼
A aa = new A();
B bb = new B();
//這句沒問題
aa = bb;
//子類向父類轉化的過程中存在問題
bb = aa;
以上協變和抗變都是由這個原因產生的
by:http://blog.csdn.net/gishero/article/details/5161826
C#==>匿名方法