Xem bốn dòng trong Go() phương pháp dưới đây:Sự khác biệt giữa tạo đại biểu tiềm ẩn và rõ ràng (có và không có generics)
delegate void Action<T>(T arg);
delegate void Action();
void DoSomething<T>(Action<T> action)
{
//...
}
void DoSomething(Action action)
{
//...
}
void MyAction<T>(T arg)
{
//...
}
void MyAction()
{
//...
}
void Go<T>()
{
DoSomething<T>(MyAction<T>); // throws compiler error - why?
DoSomething(new Action<T>(MyAction<T>)); // no problems here
DoSomething(MyAction); // what's the difference between this...
DoSomething(new Action(MyAction)); // ... and this?
}
Lưu ý rằng lỗi biên dịch được tạo ra bởi các cuộc gọi đầu tiên là: Các đối số kiểu cho phương thức 'Hành động (T)' không thể 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.
Tôi không thể hiểu làm thế nào điều này sẽ biên dịch (trong sự cô lập): trống DoSomething (Action hành động) {// ... } Kể từ khi T không được công bố ... là toàn bộ điều bên trong một lớp học chung chung? –
Vâng tôi đang sửa đổi ví dụ của tôi bây giờ. Nên đọc Go() {... –
Có phải tôi, nhưng khi tôi biên dịch mã bạn có ở đây nó biên dịch không có lỗi.Giả sử tôi đặt mã trong lớp không chung chung. Tôi đang sử dụng C# 3.5 SP1 – JoshBerke