Những người khác đã chỉ ra rằng có vô số loại đại biểu có thể có mà bạn có thể có nghĩa; về rất đặc biệt là những gì Func
mà nó xứng đáng được mặc định thay vì Predicate
hoặc Action
hoặc bất kỳ khả năng nào khác? Và, đối với lambdas, tại sao rõ ràng ý định là chọn hình thức đại biểu, thay vì hình thức cây biểu thức?
Nhưng chúng ta có thể nói điều đó Func
thật đặc biệt, và loại suy ra của phương pháp lambda hoặc ẩn danh là Func của một cái gì đó. Chúng tôi vẫn có đủ loại vấn đề. Những loại bạn muốn được suy luận cho các trường hợp sau đây?
var x1 = (ref int y)=>123;
Không có Func<T>
loại mà có một ref bất cứ điều gì.
var x2 = y=>123;
Chúng tôi không biết loại tham số chính thức, mặc dù chúng tôi biết sự trở lại. (Hay chúng ta? Là trả về int? Dài? Ngắn? Byte?)
var x3 = (int y)=>null;
Chúng tôi không biết loại trả về, nhưng nó không thể bị hủy. Kiểu trả về có thể là bất kỳ loại tham chiếu hoặc bất kỳ loại giá trị nullable nào.
var x4 = (int y)=>{ throw new Exception(); }
Một lần nữa, chúng ta không biết loại trả về và lần này nó có thể bị hủy.
var x5 = (int y)=> q += y;
Đó có phải là một tuyên bố lambda trả về void hoặc một cái gì đó trả về giá trị được gán cho q? Cả hai đều hợp pháp; Nên chọn cái nào?
Bây giờ, bạn có thể nói, tốt, đừng hỗ trợ bất kỳ tính năng nào trong số đó. Chỉ cần hỗ trợ các trường hợp "bình thường" trong đó các loại có thể được giải quyết. Điều đó không có ích. Làm thế nào mà làm cho cuộc sống của tôi dễ dàng hơn? Nếu tính năng đôi khi hoạt động và đôi khi không thành công thì tôi vẫn phải viết mã để phát hiện tất cả các tình huống lỗi đó và đưa ra một thông báo lỗi có ý nghĩa cho từng tình huống . Chúng ta vẫn phải chỉ định tất cả hành vi đó, ghi lại nó, viết các bài kiểm tra cho nó, v.v. Đây là một tính năng rất đắt tiền giúp người dùng tiết kiệm được khoảng nửa tá tổ hợp phím. Chúng tôi có những cách tốt hơn để tăng giá trị cho ngôn ngữ hơn là dành nhiều thời gian để viết các trường hợp thử nghiệm cho một tính năng không hoạt động được một nửa thời gian và hầu như không cung cấp bất kỳ lợi ích nào trong trường hợp nó hoạt động.
Tình huống thực sự hữu ích là:
var xAnon = (int y)=>new { Y = y };
bởi vì không có loại "có thể nói" cho điều đó. Nhưng chúng tôi luôn có vấn đề này và chúng tôi chỉ sử dụng suy luận kiểu phương pháp để suy ra kiểu:
Func<A, R> WorkItOut<A, R>(Func<A, R> f) { return f; }
...
var xAnon = WorkItOut((int y)=>new { Y = y });
và bây giờ suy luận kiểu phương thức tìm ra kiểu func là gì.
Func<>
chấp nhận tối đa 16 đối số.