2008-11-06 48 views
5

tình Vì vậy, kỳ quặc mà tôi chạy vào ngày hôm nay với OrderBy:C# 3.0 Func/OrderBy suy luận kiểu

Func<SomeClass, int> orderByNumber = 
    currentClass => 
    currentClass.SomeNumber; 

Sau đó:

someCollection.OrderBy(orderByNumber); 

này là tốt, nhưng tôi sẽ tạo ra một phương pháp thay bởi vì nó có thể được sử dụng ở một nơi khác ngoài một orderBy.

private int ReturnNumber(SomeClass currentClass) 
{ 
    return currentClass.SomeNumber; 
} 

Bây giờ khi tôi cố gắng cắm đó vào OrderBy:

someCollection.OrderBy(ReturnNumber); 

Nó không thể suy ra các loại như nó có thể nếu tôi sử dụng một Func. Có vẻ như với tôi, họ nên giống nhau vì bản thân phương thức này được "gõ mạnh" như Func.

Side Lưu ý: Tôi nhận ra tôi có thể làm điều này:

Func<SomeClass, int> orderByNumber = ReturnNumber; 

Trả lời

8

Điều này cũng có thể liên quan đến "return-type type inference" not working on Method Groups.

Về cơ bản, trong các trường hợp (như vị ngữ của Where), trong đó các tham số chung chỉ ở vị trí đầu vào, chuyển đổi nhóm phương thức hoạt động tốt. Nhưng trong trường hợp tham số chung là kiểu trả về (như Select hoặc OrderBy dự đoán), trình biên dịch sẽ không suy ra chuyển đổi ủy nhiệm thích hợp.

8

ReturnNumberkhông một phương pháp - thay vào đó, nó đại diện cho một nhóm phương pháp chứa tất cả phương pháp với tên ReturnNumber nhưng với chữ ký arity-and-type có khả năng khác nhau. Có một số vấn đề kỹ thuật với việc tìm ra phương pháp nào trong nhóm phương pháp mà bạn thực sự muốn theo cách rất chung chung và công việc mỗi lần. Rõ ràng, trình biên dịch có thể tìm ra một số, thậm chí phần lớn thời gian, nhưng một quyết định được đưa ra là đưa một thuật toán vào trình biên dịch chỉ làm việc được nửa thời gian là một ý tưởng tồi.

Các công trình sau đây, tuy nhiên:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber)) 
+0

nhóm Phương pháp là một cái gì đó tôi đã không suy nghĩ về. Ước gì tôi có thể đánh dấu hai câu trả lời. –

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