2010-11-15 48 views
11

Tại sao trình biên dịch C# không phỏng đoán thực tế là FooExt.Multiply() thỏa mãn chữ ký của Functions.Apply()? Tôi phải xác định một biến đại biểu riêng biệt của loại Func<Foo,int,int> cho mã để làm việc ... nhưng nó có vẻ như suy luận kiểu nên xử lý này. Liệu tôi có sai? Và, nếu có, tại sao?Tại sao trình biên dịch C# không tự động suy ra các loại trong mã này?

EDIT: Các lỗi biên dịch nhận được là:

Những lập luận kiểu cho phương pháp FirstClassFunctions.Functions.Apply<T1,T2,TR>(T1, System.Func<T1,T2,TR>, T2)' không thể được suy ra từ việc sử dụng. Cố gắng xác định các đối số loại một cách rõ ràng

namespace FirstClassFunctions { 
    public class Foo { 
     public int Value { get; set; } 

     public int Multiply(int j) { 
      return Value*j; 
     } 
    } 

    public static class FooExt { 
     public static int Multiply(Foo foo, int j) { 
      return foo.Multiply(j); 
     } 
    } 

    public static class Functions { 
     public static Func<TR> Apply<T1,T2,TR>(this T1 obj, 
               Func<T1,T2,TR> f, T2 val) { 
      return() => f(obj, val); 
     } 
    } 


    public class Main { 
     public static void Run() { 
      var x = new Foo {Value = 10}; 
      // the line below won't compile ... 
      var result = x.Apply(FooExt.Multiply, 5); 
      // but this will: 
      Func<Foo, int, int> f = FooExt.Multiply; 
      var result = x.Apply(f, 5); 
     } 
    } 
+0

Sau đây cũng nên làm việc: 'x.Apply (mới Func (FooExt.Multiply), 5)'. Lỗi biên dịch là gì? – thecoop

+1

Dường như biên dịch tốt cho tôi, trong .NET 4.0. –

+0

có thể trùng lặp của [C# 3.0 suy luận kiểu chung chung - chuyển một đại biểu dưới dạng tham số hàm] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passing-a-delegate- as-a-function-parameter) – thecoop

Trả lời

5

Tôi tin rằng đây là kết quả của sự bất lực VS2008 biên dịch C# để suy ra một cách chính xác các loại tham gia khi chuyển đổi một nhóm phương pháp để một đại biểu. @Eric Lippert thảo luận về hành vi này trong bài đăng của mình C# 3.0 Return Type Inference Does Not Work On Method Groups.

Nếu tôi nhớ chính xác, một số cải tiến đã được thực hiện trong trình biên dịch C# mới là một phần của VS2010, mở rộng các trường hợp suy luận nhóm phương pháp có thể.

Bây giờ, các quy tắc về suy luận kiểu khá phức tạp và tôi không phải là chuyên gia trong chủ đề này. Hy vọng rằng một người nào đó với một số kiến ​​thức thực sự có thể giải quyết câu hỏi này nếu tôi nhầm.

+0

Phân tích của bạn là chính xác. –

+0

@Eric Lippert: Cảm ơn bạn đã xác nhận. BTW, tôi nghĩ rằng tôi nhớ lại bạn viết blog về những cải tiến để loại suy luận trong trình biên dịch C# mới nhất, nhưng tôi dường như không thể tìm thấy bất kỳ bài viết nào trên blog của bạn về hiệu ứng đó ... có lẽ tôi tưởng tượng điều đó. – LBushkin

+0

Tôi đã đề cập rằng chúng tôi sẽ sửa chữa nó, tại đây: http://blogs.msdn.com/b/ericlippert/archive/2008/05/28/method-type-inference-changes-part-zero.aspx –

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