Chương trình sau đây không biên dịch, vì phù hợp với lỗi, trình biên dịch chọn phương thức có tham số T
đơn lẻ làm độ phân giải, không thành công vì List<T>
không phù hợp với các ràng buộc chung của duy nhất T
. Trình biên dịch không nhận ra rằng có một phương pháp khác có thể được sử dụng. Nếu tôi loại bỏ phương thức đơn T
, trình biên dịch sẽ tìm đúng phương thức cho nhiều đối tượng.Độ phân giải phương pháp mở rộng chung không thành công
Tôi đã đọc hai bài đăng blog về độ phân giải phương pháp chung, một từ JonSkeet here và một bài khác từ Eric Lippert here, nhưng tôi không thể tìm thấy giải thích hoặc cách giải quyết vấn đề của mình.
Rõ ràng, có hai phương pháp có tên khác nhau sẽ hoạt động, nhưng tôi thích thực tế là bạn có một phương pháp duy nhất cho những trường hợp đó.
namespace Test
{
using System.Collections.Generic;
public interface SomeInterface { }
public class SomeImplementation : SomeInterface { }
public static class ExtensionMethods
{
// comment out this line, to make the compiler chose the right method on the line that throws an error below
public static void Method<T>(this T parameter) where T : SomeInterface { }
public static void Method<T>(this IEnumerable<T> parameter) where T : SomeInterface { }
}
class Program
{
static void Main()
{
var instance = new SomeImplementation();
var instances = new List<SomeImplementation>();
// works
instance.Method();
// Error 1 The type 'System.Collections.Generic.List<Test.SomeImplementation>'
// cannot be used as type parameter 'T' in the generic type or method
// 'Test.ExtensionMethods.Method<T>(T)'. There is no implicit reference conversion
// from 'System.Collections.Generic.List<Test.SomeImplementation>' to 'Test.SomeInterface'.
instances.Method();
// works
(instances as IEnumerable<SomeImplementation>).Method();
}
}
}
Bạn đã thử 'instances.Method();'? –
Dmitry
@Dmitry thực sự sẽ hoạt động. Tôi sẽ kiểm tra một vài điều. – nvoigt