У меня проблемы с тем, чтобы компилятор 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));
}
Все звонки распечатать Called instance method.
.
У меня нет доступа к классу C
, очевидно, иначе я бы не стал создавать методы расширения, и мое расширение важно, потому что это позволило бы моим пользователям продолжать использовать класс, который они уже знают, с некоторой добавленной стоимостью .
Из того, что я понял, компилятор предпочтет методы экземпляра перед методами расширения, но является ли это единственным правилом? Это означало бы, что любой класс с методом, который выглядит как Method(string format, params object[] args)
, не может иметь методы расширения с первым параметром типа string
.
Будем весьма благодарны за любые объяснения причин такого поведения или способа его обойти (то есть , а не"просто позвоните CExtensions.Trace(c, "Category", ...
").