Các mã sau đây không biên dịch (error CS0123: No overload for 'System.Convert.ToString(object)' matches delegate 'System.Converter<T,string>'
):Độ phân giải quá tải nhóm phương pháp khác với độ phân giải quá tải cuộc gọi phương thức?
class A<T> {
void Method(T obj) {
Converter<T, string> toString = Convert.ToString;
// this doesn't work either (on .NET 4):
Converter<object, string> toString2 = Convert.ToString;
Converter<T, string> toString3 = toString2;
}
}
Tuy nhiên, điều này không:
class A<T> {
void Method(T obj) {
// o is a T, and Convert.ToString(o) is using
// string Convert.ToString(object o)
Converter<T, string> toString = o => Convert.ToString(o);
}
}
Trong C# 4, các đại biểu đồng/trường hợp bị biến thể có thể được gán cho mỗi khác, và đại biểu có thể được tạo từ phương pháp co/contra-variant, do đó, phương pháp ToString(object)
có thể được sử dụng làm Converter<T, string>
, vì T
luôn luôn có khả năng chuyển đổi thành số object
.
Vì vậy, ví dụ đầu tiên (phương pháp phân giải quá tải nhóm phương pháp) nên tìm phương pháp áp dụng duy nhất string Convert.ToString(object o)
, giống như phương pháp gọi quá tải độ phân giải. Tại sao nhóm phương pháp & giải quyết quá tải cuộc gọi phương thức tạo ra các kết quả khác nhau?
Cụ thể hơn, nó không hoạt động đối với 'T' không bị ràng buộc bởi vì nó _might be_ một loại giá trị. – thecoop