2010-05-06 28 views
5
public class Program 
{ 
    delegate void Srini(string param); 

    static void Main(string[] args) 
    { 
     Srini sr = new Srini(PrintHello1); 
     sr += new Srini(PrintHello2);  //case 2:  
     sr += new Srini(delegate(string o) { Console.WriteLine(o); }); 
     sr += new Srini(delegate(object o) { Console.WriteLine(o.ToString()); }); //case 4: 
     sr += new Srini(delegate { Console.WriteLine(「This line is accepted,though the method signature is not Comp」); });//case 5 
     sr("Hello World"); 
     Console.Read(); 
    }  

    static void PrintHello1(string param) 
    { 
     Console.WriteLine(param); 
    } 

    static void PrintHello2(object param) 
    { 
     Console.WriteLine(param); 
    } 
} 

編譯器不會抱怨案例2(請參閱註釋),好吧,原因是字符串從對象繼承後直接進行。按照同樣的思路,爲什麼會抱怨匿名方法的類型(見註釋//情況下4 :)是不能爲委託人指定一個不太具體的參數類型的匿名方法

無法轉換匿名方法委託類型「DelegateTest.Program.Srini」因爲參數類型不匹配代表參數類型

哪裏在正常方法的情況下它不?還是我比較蘋果和橘子? 另一種情況是爲什麼它接受不帶參數的匿名方法?

回答

7

方法組轉換支持方差(從C#2開始 - 它們不在C#1中),匿名函數轉換根本不支持。鑑於每當你寫一個匿名函數,你可以可以寫出適當的參數,爲什麼不這樣做呢?就我所能看到的那樣允許差異沒有任何好處,它會使規則更難以正確。 (差異最終在規範中非常複雜)

編輯:沒有參數列表的匿名方法基本上與任何代理的參數列表兼容,只要它沒有out參數。基本上這是一種說法,「我不關心參數。」它是一個 lambda表達式沒有的匿名方法的功能:)

+0

糟糕jon,這是一個錯字;它沒有。我指的是// case 5。我編輯了這個問題。 – 2010-05-06 07:16:51

+0

@Srinivas:好的,我已經適當地編輯了答案。 – 2010-05-06 07:20:25

相關問題