2009-06-20 32 views

Trả lời

11

Bạn thể sử dụng chức năng ẩn danh, bạn chỉ phải quăng đầu tiên:

dynamic list = new List<string>() { "10", "20" }; 
dynamic converted = list.ConvertAll((Func<string, int>) (x => int.Parse(x))); 

Điều này cũng đúng trong nhóm chuyển đổi phương pháp: hạn chế

foo.Click += (EventHandler) MyClickHandler; 

khác tôi đã gặp phải rất đến nay:

  • Phương pháp và trình xây dựng tĩnh không thể là động lực c về các loại, nhưng thể phải năng động trong điều kiện của các đối số
  • Bạn không thể sử dụng dynamic trong một loại chế
  • Bạn không thể sử dụng dynamic như một đối số kiểu trong một giao diện cho một khai báo lớp, nhưng bạn có thể sử dụng nó như một đối số kiểu cho một lớp cơ sở, tức là

    class Invalid : IEnumerable<dynamic> 
    class Valid : List<dynamic> 
    
  • phương pháp mở rộng không thể phát hiện tại thời gian thực hiện (nhưng bạn có thể gọi phương thức tĩnh trực tiếp với các đối số động)

  • Có lỗi trong 4.0b1 sao cho bạn không thể chuyển đổi từ dynamic[] thành IEnumerable<dynamic> - điều đó sẽ được khắc phục cho bản phát hành.
  • Bạn không thể sử dụng dynamic như một lớp cơ sở

(Lưu ý rằng đây là những hạn chế của C# 4.0 càng nhiều càng tốt của DLR riêng của mình. Tôi có cảm giác đó là những gì bạn có nghĩa là mặc dù.)

+0

Tuyệt vời, tốt để có được câu trả lời từ bạn :) – amazedsaint

+1

Không phải tất cả việc sử dụng các đại biểu đều cần diễn viên, không chỉ là anons/lambdas? ví dụ. trong btn.Click + = MyClickHandler; nếu btn là động nhưng có một sự kiện Click, điều đó sẽ không hoạt động. Bạn cần cast xung quanh tên phương thức MyClickHandler. –

+0

@Earwicker: Không * tất cả * sử dụng các đại biểu, nhưng bạn nói đúng rằng các chuyển đổi nhóm phương pháp cũng yêu cầu một diễn viên. Sẽ cập nhật câu trả lời của tôi cho phù hợp. –

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