У меня проблемы с тем, чтобы компилятор C # вызвал созданный мной метод расширения, поскольку вместо этого он предпочитает метод экземпляра с аргументом 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.");
}
}
В моем примере программы:
public void Main()
{
var c = new C();
c.Trace("Message");
c.Trace("Message: {0}", "foo");
c.Trace("Category", "Message", new KeyValuePair<string, decimal>("key", 123));
}
Все вызовы print Вызываемый метод экземпляра.
.
У меня нет доступа к классу C
, очевидно, иначе я бы не стал беспокоиться о создании методов расширения, и мое расширение важно, потому что оно позволит моим пользователям продолжать использовать класс, который они уже знают с некоторой добавленной стоимостью.
Насколько я понял, компилятор будет отдавать предпочтение методам экземпляра, а не методам расширения, но разве это единственное правило? Это означало бы, что любой класс с методом, который выглядит как Method (формат строки, params object [] args)
, не может иметь методов расширения с первым параметром типа string
.
Любое объяснение причин такого поведения или способ его решения (то есть , а не «просто вызовите CExtensions.Trace (c,« Категория », ...
") были бы весьма признательны.