Tôi đã nhận thấy một số ví dụ về những thứ hoạt động và không hoạt động khi xử lý các hàm lambda và các đại biểu ẩn danh trong C#. Những gì đang xảy ra ở đây?Làm cách nào để nhập và ủy quyền đại biểu/lambda?
class Test : Control {
void testInvoke() {
// The best overloaded method match for 'Invoke' has some invalid arguments
Invoke(doSomething);
// Cannot convert anonymous method to type 'System.Delegate' because it is not a delegate type
Invoke(delegate { doSomething(); });
// OK
Invoke((Action)doSomething);
// OK
Invoke((Action)delegate { doSomething(); });
// Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
Invoke(() => doSomething());
// OK
Invoke((Action)(() => doSomething()));
}
void testQueueUserWorkItem() {
// The best overloaded method match for 'QueueUserWorkItem' has some invalid arguments
ThreadPool.QueueUserWorkItem(doSomething);
// OK
ThreadPool.QueueUserWorkItem(delegate { doSomething(); });
// The best overloaded method match for 'QueueUserWorkItem' has some invalid arguments
ThreadPool.QueueUserWorkItem((Action)doSomething);
// No overload for 'doSomething' matches delegate 'WaitCallback'
ThreadPool.QueueUserWorkItem((WaitCallback)doSomething);
// OK
ThreadPool.QueueUserWorkItem((WaitCallback)delegate { doSomething(); });
// Delegate 'WaitCallback' does not take '0' arguments
ThreadPool.QueueUserWorkItem(() => doSomething());
// OK
ThreadPool.QueueUserWorkItem(state => doSomething());
}
void doSomething() {
// ...
}
}
Vâng, đó là rất nhiều ví dụ. Tôi đoán câu hỏi của tôi như sau:
Tại sao
Invoke
luôn từ chối một hàm lambda hoặc một đại biểu vô danh, nhưngThreadPool.QueueUserWorkItem
không chỉ tốt?Heck làm gì "Không thể chuyển đổi phương thức ẩn danh để nhập 'System.Delegate' vì nó không phải là loại đại biểu" có nghĩa là gì?
Tại sao
ThreadPool.QueueUserWorkItem
chấp nhận một đại biểu ẩn danh không có tham số, nhưng không chấp nhận biểu thức lambda không có tham số?
Và tôi nghĩ tôi hiểu đại biểu và lambdas. Tôi thật ngu ngốc. – recursive
Các nội dung hay ho hơn bao giờ hết, +1 cho "... là tính năng duy nhất mà chúng có biểu thức lambda không." – Ani
@recursive, nếu bạn quan tâm để tìm hiểu thêm, hãy đọc trên cây biểu đạt. Điều thú vị về các biểu thức lambda là chúng thực sự là _expressions_, với một mô hình mô tả phong phú cho những gì được thể hiện, và không chỉ đơn thuần là một cú pháp cú pháp để truyền logic tới tham số ủy nhiệm. Đây là những gì cho phép phép thuật như LINQ to SQL xảy ra. http://msdn.microsoft.com/en-us/library/bb397951.aspx –