2008-12-11 43 views
13

Tôi muốn tạo một loại đại biểu trong C# bên trong một phương thức nhằm mục đích tạo các phương thức Chưa xác định.Tạo kiểu đại biểu bên trong một phương thức

Ví dụ:


public void MyMethod(){ 
    delegate int Sum(int a, int b); 

    Sum mySumImplementation=delegate (int a, int b) {return a+b;} 

    Console.WriteLine(mySumImplementation(1,1).ToString()); 
} 

Thật không may, tôi không thể làm điều đó trong .NET 2.0 và C# 2.0.

Trả lời

17

Tại sao bạn muốn tạo loại đại biểu trong phương thức? Có gì sai khi tuyên bố nó bên ngoài phương pháp? Về cơ bản, bạn không thể làm điều này - bạn không thể khai báo một loại (bất kỳ loại nào) trong một phương thức.

Một thay thế sẽ được tuyên bố tất cả các Func/Hành động đại biểu chung chung mà có mặt trong .NET 3.5 - sau đó bạn chỉ có thể làm:

public void MyMethod(){ 
    Func<int, int, int> mySumImplementation = 
     delegate (int a, int b) { return a+b; }; 

    Console.WriteLine(mySumImplementation(1,1).ToString()); 
} 

Các tờ khai đang trên C#/.NET Versions page tôi.

+8

"? Tại sao bạn muốn để tạo ra các loại đại biểu trong phương pháp" - bởi vì điều duy nhất sử dụng loại đại biểu là một cuộc gọi lại được xác định trong phương thức, do đó, lan truyền nội dung đó là khái niệm địa phương đến phương pháp bên ngoài của phương pháp cảm thấy ... icky. –

13

Đại biểu loại phải được xác định bên ngoài chức năng. Các đại biểu thực tế có thể được tạo ra bên trong phương pháp như bạn làm.

class MyClass { 
    delegate int Sum(int a, int b); 
    public void MyMethod(){ 

     Sum mySumImplementation=delegate (int a, int b) {return a+b;} 

     Console.WriteLine(mySumImplementation(1,1).ToString()); 
    } 

} 

sẽ hợp lệ. Giải pháp tốt nhất có thể để thi đua .NET3.5, và tạo ra một số loại đại biểu chung chung trên toàn cầu, có thể được sử dụng trên tất cả các giải pháp của bạn, để tránh phải loại đại biểu liên tục redeclare cho tất cả mọi thứ:

delegate R Func<R>(); 
delegate R Func<T, R>(T t); 
delegate R Func<T0, T1, R>(T0 t0, T1 t1); 
delegate R Func<T0, T1, T2, R>(T0 t0, T1 t1, T2 t2); 

Sau đó, bạn chỉ có thể sử dụng một đại biểu Func<int, int, int> trong mã của bạn ở trên.

4

Đại biểu được biên dịch thành các lớp (một lớp kế thừa từ System.MulticastDelegate). Trong C#, bạn không được phép khai báo một lớp bên trong một phương thức (xem đặc tả ngôn ngữ C#). Vì vậy, bạn không thể khai báo một đại biểu trong một phương thức.

0

gì về điều này:

static void Main(string[] args) 
{ 
    Expression<Func<int, int, int>> exFunc = (a, b) => a + b; 
    var lambda = exFunc as LambdaExpression; 
    Delegate del = exFunc.Compile(); 
    Console.WriteLine(del.DynamicInvoke(2, 2)); 
} 
Các vấn đề liên quan