Tôi muốn viết một phương pháp mở rộng sẽ hoạt động trên các từ điển có giá trị là một số loại chuỗi. Thật không may, trình biên dịch dường như không thể suy ra các đối số chung từ việc sử dụng phương thức của tôi; Tôi cần phải xác định rõ ràng.Generics: Tại sao trình biên dịch không thể suy ra các đối số kiểu trong trường hợp này?
public static void SomeMethod<TKey, TUnderlyingValue, TValue>
(this IDictionary<TKey, TValue> dict)
where TValue : IEnumerable<TUnderlyingValue> { }
static void Usage()
{
var dict = new Dictionary<int, string[]>();
var dict2 = new Dictionary<int, IEnumerable<string>>();
//These don't compile
dict.SomeMethod();
SomeMethod(dict); // doesn't have anything to do with extension-methods
dict2.SomeMethod(); // hoped this would be easier to infer but no joy
//These work fine
dict.SomeMethod<int, string, string[]>();
dict2.SomeMethod<int, string, IEnumerable<string>>();
}
Tôi nhận ra rằng suy luận kiểu không phải là khoa học chính xác, nhưng tôi tự hỏi liệu có một số 'quy tắc' cơ bản tôi thiếu ở đây - tôi không quen với các chi tiết của thông số.
- Đây có phải là một thiếu sót của quá trình suy luận hay là kỳ vọng rằng trình biên dịch sẽ "tìm ra" không hợp lý trong trường hợp này (không rõ ràng)?
- Tôi có thể thay đổi chữ ký của phương thức theo cách có thể làm cho nó hoạt động bình thường như 'không thể sửa'?
Suy luận TUnderlyingValue có thể khó khăn. Đặc biệt là vì tham số kiểu của 'IEnumerable <>' là sự biến đổi trong .net 4. – CodesInChaos
Suy luận kiểu là một khoa học chính xác có các thuật toán chính thức, nó không chỉ là một phỏng đoán. Nếu một trình biên dịch không thể suy ra một kiểu, nó chỉ vì nó không có các quy tắc cụ thể để xử lý một số trường hợp, và nó thường là một thiết kế thực hiện, không phải là một giới hạn. Hãy xem tại đây: http://www.classes.cs.uchicago.edu/archive/2005/winter/33600-1/slides/Lesson10.pdf – Jack
@Jack: Cảm ơn bạn đã liên kết; Nó thật thú vị. Xem bình luận của tôi về câu trả lời của Eric Lippert cho những gì tôi muốn nói. Nghèo lựa chọn các từ về phần tôi, tôi giả sử. – Ani