Tôi gặp sự cố khi tải trình biên dịch C# để gọi một phương thức mở rộng mà tôi đã tạo, vì nó thích một phương thức thể hiện với đối số params
thay thế.Làm thế nào để buộc sử dụng phương pháp mở rộng thay vì phương pháp dụ với thông số?
Ví dụ, nói rằng tôi có lớp sau và phương pháp của nó:
public class C
{
public void Trace(string format, params object[] args)
{
Console.WriteLine("Called instance method.");
}
}
Và và mở rộng:
public static class CExtensions
{
public void Trace(this C @this, string category, string message, params Tuple<string, decimal>[] indicators)
{
Console.WriteLine("Called extension method.");
}
}
Trong chương trình mẫu của tôi:
pubic void Main()
{
var c = new C();
c.Trace("Message");
c.Trace("Message: {0}", "foo");
c.Trace("Category", "Message", new KeyValuePair<string, decimal>("key", 123));
}
Tất cả gọi in Called instance method.
.
Tôi không có quyền truy cập vào lớp C
, rõ ràng hoặc tôi sẽ không bận tâm đến việc tạo các phương thức tiện ích và tiện ích mở rộng của tôi quan trọng vì nó sẽ cho phép người dùng của tôi tiếp tục sử dụng một lớp học mà họ đã biết.
Từ những gì tôi đã hiểu, trình biên dịch sẽ ưu tiên các phương pháp ví dụ trên các phương pháp mở rộng, nhưng đây có phải là quy tắc duy nhất không? Điều đó có nghĩa là bất kỳ lớp nào có phương thức giống như Method(string format, params object[] args)
không thể có các phương thức mở rộng với tham số đầu tiên thuộc loại string
.
Bất kỳ lời giải thích nào về lý do cho hành vi này hoặc cách giải quyết nó (nghĩa là không phải "chỉ cần gọi CExtensions.Trace(c, "Category", ...
") sẽ được đánh giá cao.
Tôi đã xem xét điều này trước đây. Dường như giải pháp duy nhất là đổi tên phương thức. Tôi muốn được quan tâm để xem nếu có một sửa chữa. – Polynomial