2013-05-15 36 views
7
([MyCustomAttribute(...)] param1, param2) => 
{ 
    ... 

nơi param1 là Type1 và param2 là Type2thuộc tính Custom trên tham số của một lambda anonymous

Dường như với tôi đây là chính xác giống như

private void method blah([MyCustomAttribute(...)] Type1 param1, Type2 param2) 
{ 
    ... 

Nhưng phiên bản đầu tiên là không được trình biên dịch C# cho phép. Tại sao? Đây có phải là một trong số time vs effort/payback things không? Điều này không đơn giản không nhất quán?

+4

Chỉ vì tò mò, tại sao bạn cần phải gán một tham số trên một phương thức ẩn danh? – Dan

+1

Tôi cần phải (loại) chú thích một trong các tham số là một khối không được quản lý, không được quản lý, nhưng thực sự có thể là float [], float2 [], float4 [] v.v. Ở những nơi khác trong mã của tôi, chú thích kiểu này được sử dụng cho kiểm tra đơn vị và bán phá giá dữ liệu (theo định dạng có thể đọc được của con người). – Ani

+0

Bạn có lẽ sẽ tốt hơn khi chỉ thực hiện một phương pháp cụ thể hơn là một phương thức ẩn danh. – Dan

Trả lời

6

Tại sao?

Vì tôi thích chỉ ra, nhóm thiết kế ngôn ngữ không phải cung cấp lý do cho việc không làm một tính năng. Thay vào đó, những người muốn các tính năng phải biện minh cho họ.

Nếu bạn đặt câu hỏi được nhắm mục tiêu nhiều hơn thay vì mơ hồ "tại sao?" bạn có thể hỏi:

Nếu tôi đưa tính năng này vào nhóm thiết kế C#, họ sẽ xác định những vấn đề gì với nó?

Không có yêu cầu trong ngôn ngữ C# mà lambdas được triển khai như các phương thức của một lớp.

Trước hết, chúng có thể là cây biểu thức, trong trường hợp nào, nó có ý nghĩa gì khi có thuộc tính ở đó? Và thứ hai, không có yêu cầu rằng lambda được triển khai làm phương thức của lớp đóng cửa do biên dịch tạo ra, có nghĩa là không có yêu cầu danh sách tham số thậm chí là thứ bạn có thể đặt siêu dữ liệu một cách hợp lý. Thuộc tính là một phần của siêu dữ liệu của chương trình và thường không nghĩ đến việc duyệt các loại do trình biên dịch tạo ra để tiêu thụ siêu dữ liệu của chúng như là một điều hợp lý để làm.

Việc triển khai biểu thức lambdas kỳ lạ nhưng hoàn toàn khả thi, chẳng hạn, sẽ tạo ra cây biểu thức luôn, và sau đó nếu nó không phải là một cây biểu thức lambda, hãy tạo ra một cuộc gọi đến Compile ở đầu kia. Không có siêu dữ liệu, do đó không có nơi nào để đặt thuộc tính.

Điều đó sẽ rất lạ, nhưng ngôn ngữ C# đã được thiết kế cẩn thận sao cho các tính năng nhất định như lambdas không hạn chế trình biên dịch trình biên dịch đối với một triển khai cụ thể.

Đây có phải là một trong những thời điểm đó so với nỗ lực/hoàn vốn không?

Có.

Có ai đó nghĩ điều này mặc dù và nói, naah!?

Không phải với kiến ​​thức của tôi.

Như tôi thường xuyên chỉ ra, để một tính năng được triển khai, nó phải là được nghĩ là. Theo hiểu biết của tôi, bạn là người đầu tiên nghĩ rằng một thuộc tính trên tham số lambda là một ý tưởng hay.Ý tưởng không được nghĩ đến không được thiết kế, triển khai, thử nghiệm, ghi chép hoặc vận chuyển.

Điều này không đơn giản không nhất quán?

Tôi cho là vậy.

+0

Cảm ơn bạn đã trả lời. Xin lưu ý rằng "lý do" mơ hồ của tôi dựa trên giả định rằng có một lý do sâu, tối và bí ẩn như thế này đã bị bỏ qua. Trong trường hợp vắng mặt, * "Nếu tôi đưa tính năng này vào nhóm thiết kế C#, họ sẽ nhận ra vấn đề gì với nó?" * Có lẽ phù hợp hơn. Tôi sẽ gửi yêu cầu lỗi/tính năng này trên trang web Microsoft Connect. Cảm ơn một lần nữa! – Ani

+2

Tôi đã gặp một tình huống gần đây, nơi nó sẽ rất hữu ích để có thể trang trí một lambda với một thuộc tính mức phương thức (trong trường hợp của tôi là thuộc tính 'DebuggerNonUserCode' để ngăn chặn các lỗi IOExceptions được mong đợi và bị bắt trong lambda từ việc phá vỡ trình gỡ lỗi). – MgSam

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