2010-01-02 19 views
9

tôi có một đại biểu được định nghĩa trong mã của tôi:Viết lambda hoặc chức năng vô danh mà chấp nhận một tham số ra

public bool delegate CutoffDateDelegate(out DateTime cutoffDate); 

Tôi muốn tạo đại biểu và khởi tạo với một lambda hoặc chức năng ẩn danh, nhưng không ai trong số những biên soạn .

CutoffDateDelegate del1 = dt => { dt = DateTime.Now; return true; } 
CutoffDateDelegate del2 = delegate(out dt) { dt = DateTime.Now; return true; } 

Có cách nào để thực hiện việc này không?

+2

Nhận ra đây là loại cũ, nhưng tôi đừng nghĩ rằng đó là một bản sao. Câu hỏi được liên kết là sử dụng tham số out của hàm cha (?) Bên trong hàm ẩn danh, trong khi câu hỏi này là về việc khai báo một hàm ẩn danh có tham số riêng của nó. – Salvador

Trả lời

18

Bạn có thể sử dụng lambda hoặc cú pháp đại biểu vô danh - bạn chỉ cần xác định kiểu của đối số, và đánh dấu nó như là ra:

public delegate bool CutoffDateDelegate(out DateTime cutoffDate); 

// using lambda syntax: 
CutoffDateDelegate d1 = 
    (out DateTime dt) => { dt = DateTime.Now; return true; }; 

// using anonymous delegate syntax: 
CutoffDateDelegate d2 = 
    delegate(out DateTime dt) { dt = DateTime.Now; return true; } 

Trong khi tuyên bố một cách rõ ràng lập luận như ref ra/vào dự kiến , phải khai báo các kiểu đối số trong biểu thức lambda ít phổ biến hơn vì trình biên dịch có thể suy ra chúng. Tuy nhiên, trong trường hợp này, trình biên dịch hiện không suy ra các kiểu cho các đối số out hoặc ref trong các biểu thức lambda/anon. Tôi không chắc chắn nếu hành vi này là một lỗi/giám sát hoặc nếu có một lý do ngôn ngữ tại sao điều này phải như vậy, nhưng có một cách giải quyết đủ dễ dàng.

EDIT: tôi đã làm một kiểm tra nhanh chóng trong β2 VS2010, và nó vẫn có vẻ như bạn phải xác định các loại đối số - họ không được suy ra cho C# 4.

+4

Tôi sẽ không coi đó không phải là lỗi hay giám sát. Tôi nghĩ rằng bạn nên rõ ràng trong nói rằng đó là một tham số ra hoặc ref. Tại sao bạn không thể viết '(out dt) => ...' lại là một vấn đề khác. –

+1

Đó là thực sự những gì tôi đã đề cập đến - đánh dấu args rõ ràng ra/ref dự kiến ​​trong C#. Việc khai báo kiểu đối số cho lambdas ít phổ biến hơn, vì trong hầu hết các trường hợp, trình biên dịch thực hiện một công việc tuyệt vời suy ra kiểu. Tôi sẽ cập nhật bài đăng của mình để làm rõ hơn. – LBushkin

+2

chỉ vấp phải điều này - lưu ý rằng nếu bạn có nhiều tham số, bạn phải khai báo tất cả các loại của chúng một cách rõ ràng, ngay cả khi chúng không phải là tất cả ref/out – drzaus

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