Никакая перегрузка WriteLine не соответствует делегату с той же подписью - PullRequest
3 голосов
/ 10 ноября 2011

Недавно я писал некоторый код для WriteLine с использованием делегата в .NET 3.5. Все шло хорошо с использованием различных делегатов Action, пока я не пришел к перегрузке WriteLine, которая

public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3)

Поскольку я использую .NET 3.5, делегат Action<T1, T2, T3, T4, T5> отсутствует, поэтому я быстро написал свой собственный:

public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);

Затем я назначил WriteLine этому методу Action<string, object, object, object, object> action = Console.WriteLine; и получил сообщение об ошибке

Нет перегрузки для 'WriteLine' соответствует делегату 'Действие <строка, объект, объект, объект, объект>'

Я думал, что это должно быть вызвано какой-то неполадкой, поэтому я явно объявил нового делегата:

public delegate void WriteLineAction(string format, object arg0, object arg1, object arg2, object arg3);

Затем я попытался назначить WriteLine этому новому методу и снова получил сообщение об ошибке:

Нет перегрузки для 'WriteLine' соответствует делегату 'WriteLineAction'

Еще более странным является то, что если я щелкну правой кнопкой мыши на вызове Console.WriteLine, который ошибочен, и скажу «Перейти к определению», это приведет меня к правильной версии WriteLine в метаданных, так почему не может ли он сопоставить метод с делегатом. Я делаю что-то действительно глупое или это известная проблема / функция?

1 Ответ

2 голосов
/ 10 ноября 2011

Если вы посмотрите на документы для этой перегрузки , это показывает:

Этот API не совместим с CLS.CLS-совместимая альтернатива - WriteLine(String, Object[]).

, и если вы посмотрите на вкладку C # в подписи, она говорит:

C # не поддерживает методы, которые используютаргументы переменной длины (varargs).Компилятор автоматически разрешает вызовы этого метода для того же метода, который использует массив параметров.

Вкладка C ++ показывает подпись как:

public:
static void WriteLine(
    String^ format, 
    Object^ arg0, 
    Object^ arg1, 
    Object^ arg2, 
    Object^ arg3, 
    ...
)

Я сильно подозреваю, что этовопрос.В Reflector это отображается как:

public static void WriteLine(string format, object arg0, object arg1,
    object arg2, object arg3, __arglist)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...