2012-02-22 8 views
6

Tôi đã có mã di sản mà định nghĩa các helper sauLàm cách nào để chuyển đổi đại biểu R Chức năng <T,R> (Tt) thành Func <T,R>?

public delegate R Function<T, R>(T t); 

Nhưng tôi muốn cung cấp một nỗ lực Func<T,TResult>

đúc thất bại trong việc biên dịch

Không thể chuyển đổi loại 'System.Func<T,TResult>' thành ' Rhino.Mocks.Function<T,TResult> '

Có cách nào t mũ không chỉ biên dịch, nhưng chức năng trong thời gian chạy?

Trả lời

9

Vấn đề là bạn đang cố kết hợp hai loại đại biểu khác nhau: Func<T, TResult>Function<T, TResult>. Mặc dù chúng có cùng chữ ký nhưng chúng khác nhau và do đó không tương thích với nhau.

Sử dụng lambda để tạo lớp chuyển đổi giữa hai.

Func<T, TResult> func = ...; 
TheMethod(x => func(x)); 
+0

ah, phải. viết những thứ ra ngoài thường là phương sách cuối cùng của tôi. Sẽ chấp nhận một khi SO cho phép. – Maslow

8

Bạn có thể tạo một lambda như JaredPar gợi ý, hoặc vượt qua một phương thức khởi dựng của người kia:

Func<int, string> f1 = i => i.ToString(); 
Function<int, string> f2 = new Function<int, string>(f1); 
+1

Nhờ @EricLippert để sửa biểu thức lambda; Tôi đã dành một số buổi chiều làm việc trong F #, trong đó sử dụng '->' thay vì '=>'. – phoog

9

Jared và phoog đều đúng. Một cách thứ ba để làm điều tương tự, chỉ cần làm tròn nó ra, là:

Func<int, string> func = i => i.ToString(); 
Function<int, string> function = func.Invoke; 

Đó là, các đại biểu mới là một đại biểu để phương pháp invoke của các đại biểu đầu tiên, trong đó có chữ ký chính xác.

Đó là một trong những việc phải làm là gây khó chịu trong cùng cực. Chúng tôi có đang thiết kế thời gian chạy từ đầu ngày hôm nay hay không, biết rằng giờ đây chúng tôi đã biết cách mọi người sử dụng loại đại biểu, tôi nghĩ rằng có thể sẽ có một được xây dựng theo loại đại biểu cho mỗi chữ ký (nhiều là one "single mảng chiều của các số nguyên "loại", hoặc rằng sẽ có "cấu trúc nhận dạng" giữa các loại đại biểu. Lần tới khi bạn thiết kế hệ thống kiểu cho một máy ảo, hãy ghi nhớ điều đó.

+0

Tôi không chắc liệu thời gian chạy có đúng mức để tấn công vấn đề này hay không. Đặc biệt, tôi không chắc chắn những thay đổi đó sẽ tương tác với tên thông số như thế nào. – CodesInChaos

+0

Nếu triển khai tính năng này miễn phí (tức là, sẽ không yêu cầu thử nghiệm, hãy dành thời gian của nhà phát triển ra khỏi các tính năng khác, bắt đầu ở 0 điểm thay vì -100 điểm, v.v.), sẽ có bất kỳ nhược điểm lớn nào khi triển khai không? – Brian

+0

Nếu tôi hiểu chính xác, vì nó không biên dịch, nó sẽ không giúp cho thời gian chạy được ok với nó. – Maslow