Мне сложно заставить компилятор С# вызвать метод расширения, который я создал, поскольку вместо этого он предпочитает метод экземпляра с аргументом params
.
Например, скажем, у меня есть следующий класс и его метод:
public class C
{
public void Trace(string format, params object[] args)
{
Console.WriteLine("Called instance method.");
}
}
И и расширение:
public static class CExtensions
{
public void Trace(this C @this, string category, string message, params Tuple<string, decimal>[] indicators)
{
Console.WriteLine("Called extension method.");
}
}
В моей примерной программе:
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));
}
Все вызовы печатают Called instance method.
.
У меня нет доступа к классу C
, очевидно, или я не стал бы беспокоиться о создании методов расширения, и мое расширение важно, потому что это позволит моим пользователям продолжать использовать класс, который они уже знают, с некоторой добавленной стоимостью.
Из того, что я понял, компилятор предпочитает методы экземпляра поверх методов расширения, но является ли это единственным правилом? Это означает, что любой класс с методом, который выглядит как Method(string format, params object[] args)
, не может иметь методы расширения с первым параметром типа string
.
Любое объяснение причин этого поведения или способа его работы (это не просто "вызов" CExtensions.Trace(c, "Category", ...
") будет с благодарностью.