2011-09-08 40 views
6

thể trùng lặp:
C# 3.0 generic type inference - passing a delegate as a function parameterTại sao các đối số kiểu này không thể suy ra?

Tại sao có thể không phải là đối số loại mẫu mã sau đây trong các cuộc gọi trong Main được suy ra?

using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Method(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
} 

này cung cấp cho các thông báo lỗi sau: CS0411

lỗi: Những lập luận kiểu cho phương pháp Program.Method<T>(System.Action<T>) không thể được suy ra 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.

+0

Cảm ơn bạn rất nhiều. Đã tìm kiếm nhưng tôi không thể tìm thấy nó. –

+0

@Pieter: Bài đăng được đề cập bởi Darin có câu trả lời và có một số liên kết tốt để biết thêm thông tin. –

+0

Đọc 10 bài đăng hoặc nội dung nào đó, nhưng bài viết trên không nằm trong số đó. –

Trả lời

0

Chỉ cần đặt đây là trình biên dịch tôi hiểu ý bạn là gì.

Tôi nghĩ rằng đó là vì Action được sử dụng làm nhóm phương pháp, nhưng không thuộc loại Action<int>.

Nếu bạn bỏ nó vào loại hình này hoạt động:

Method((Action<int>)Action); 
+5

Tôi mong đợi nó là int. Và tôi đoán OP đã biết những gì trình biên dịch nói với anh ta. –

+0

Đúng cho đến khi tôi đặt nó vào trình biên dịch, tôi đã không giải phóng bối cảnh của vấn đề. Không rõ ràng ngay lập tức Hành động đề cập đến phương pháp. – TheCodeKing

0

này hoạt động:

static void Main(string[] args) 
    { 
     Method<int>(Action); 
    } 

    static void Action(int arg) 
    { 
     // ... 
    } 

    static void Method<T>(Action<T> action) 
    { 
     // ... 
    } 
+1

Có, nhưng đó không phải là những gì được hỏi ở đây. Những gì được hỏi là lý do tại sao những gì được hiển thị bởi OP ** không ** làm việc. –

2

Vấn đề là Action (ngoài đã trở thành một loại; xin đổi tên nó) là thực sự nhóm phương pháp có thể chuyển đổi thành loại đại biểu Action<int>. Công cụ suy luận loại không thể suy ra loại vì các biểu thức nhóm phương thức là typeless. Nếu bạn thực sự truyền nhóm phương thức đến Action<int>, thì kiểu suy luận thành công:

Method((Action<int>)Action); // Legal 
Các vấn đề liên quan