2015-02-13 19 views
6

Nói rằng tôi có phương pháp sau:C# suy luận kiểu không thành công với phương pháp có chứa các thông số mặc định

static int MethodWithDefaultParameters(int a, int b=0, int c=1) 
{ 
    return a + b + c; 
} 

Và sau đó tôi sử dụng phương pháp này trong một truy vấn LINQ như vậy:

Enumerable.Range(1,10).Select(MethodWithDefaultParameters); 

này không thành công với :

Lỗi 1 Đối số kiểu cho phương thức 'System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable, System.Func)' không thể bị xâm phạm rred từ việc sử dụng. Hãy thử xác định các đối số kiểu một cách rõ ràng.

Tất nhiên, tôi có thể làm việc này bằng cách chèn một lambda để chuyển tiếp cuộc gọi chức năng như thế này:

Enumerable.Range(1,10).Select(i => MethodWithDefaultParameters(i)); 

Nhưng câu hỏi của tôi là tại sao những suy luận kiểu thất bại? Theo như tôi có thể nói, nó không nên mơ hồ vì chỉ có một biến thể của hàm thỏa mãn biến đầu vào.

Trả lời

10

Có hai tình trạng quá tải cho Select(). Một tham số lấy làm tham số thứ hai (nghĩa là đại biểu) là Func<TSource, TResult> và tham số mất Func<TSource, int, TResult>. I E. một chữ ký phương thức với một hoặc hai tham số.

Phương pháp của bạn không thỏa mãn. Ngay cả với các giá trị mặc định, nó vẫn có ba tham số. Tham số mặc định là một cấu trúc biên dịch và phải được cung cấp tại trang web cuộc gọi. Chúng không được điền vào trong thời gian chạy thông qua một cuộc gọi đến một cá thể đại biểu.

Vì vậy, trên thực tế, công việc của bạn là một trong hai cách hợp lý để giải quyết vấn đề. Người kia sẽ được thực hiện các thông số mặc định khác nhau (ví dụ: "cũ-trường" :)):

static int MethodWithDefaultParameters(int a) 
{ 
    return MethodWithDefaultParameters(a, 0, 1); 
} 

static int MethodWithDefaultParameters(int a, int b, int c) 
{ 
    return a + b + c; 
} 

Sau đó, bạn có thể sử dụng MethodWithDefaultParameters trong lệnh gọi Select() trực tiếp, như trình biên dịch sẽ tìm thấy sự quá tải đơn tham số tương thích với một trong các quá tải Select().

+0

Câu trả lời hay! – Enigmativity

+0

Aha, do đó, theo như công cụ suy luận loại có liên quan chữ ký cho MethodWithDefaultParameters sẽ luôn luôn có ba đối số - tức là nó sẽ không bao giờ nhìn thấy một phiên bản chỉ có một tham số. Cảm ơn lời giải thích! – Thaddeus

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