2010-05-06 25 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); 
    } 
} 

Trình biên dịch không phàn nàn về trường hợp 2 (xem nhận xét), lý do chính là chuyển tiếp từ chuỗi thừa hưởng từ đối tượng. Dọc theo đường cùng, tại sao là nó phàn nàn với nhiều loại phương pháp vô danh (xem chú thích // trường hợp 4 :) rằngKhông thể chỉ định cho đại biểu một phương thức ẩn danh có loại thông số ít cụ thể hơn

thể không chuyển đổi phương pháp vô danh ủy gõ 'DelegateTest.Program.Srini' vì các loại tham số không khớp với các loại thông số ủy quyền

trong trường hợp phương pháp bình thường thì không? Hay tôi đang so sánh táo với cam? Một trường hợp khác là tại sao nó chấp nhận phương thức nặc danh mà không có tham số?

Trả lời

7

Chuyển đổi nhóm phương pháp hỗ trợ phương sai (như C# 2 - chúng không có trong C# 1), chuyển đổi chức năng ẩn danh đơn giản là không. Cho rằng bất cứ khi nào bạn viết một hàm ẩn danh, bạn có thể ghi thông số thích hợp, tại sao không chỉ làm như vậy? Sẽ không có lợi ích trong việc cho phép phương sai ở đó như xa như tôi có thể thấy, và nó sẽ làm cho các quy tắc khó khăn hơn để có được quyền. (Phương sai kết thúc là khá phức tạp trong thông số kỹ thuật.)

EDIT: Một phương thức ẩn danh không có danh sách tham số về cơ bản tương thích với danh sách tham số của đại biểu miễn là không có thông số out. Về cơ bản nó là một cách để nói, "Tôi không quan tâm đến các thông số." Đó là tính năng của các phương thức ẩn danh mà biểu thức lambda không có :)

+0

Rất tiếc, đó là lỗi chính tả, không có. Tôi đang đề cập đến // trường hợp 5 .i đã chỉnh sửa câu hỏi. –

+0

@Srinivas: Ok, tôi đã chỉnh sửa câu trả lời một cách thích hợp. –

Các vấn đề liên quan