Как принудительно использовать метод расширения вместо метода экземпляра с параметрами?

У меня проблемы с тем, чтобы компилятор 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,« Категория », ... ") были бы весьма признательны.

11
задан StaceyGirl 9 April 2018 в 01:38
поделиться