Я заметил что-то странное при попытке передать метод StringBuilder Append функции, которая приняла Action<string>.
public void DoStuff(Action<string> handler)
{
// Do stuff, call handler("data");
}
В целях тестирования я просто хочу записать данные в StringBuilder, поэтому я попытался вызвать его следующим образом:
var output = new StringBuilder();
DoStuff(output.Append);
Однако это дает ошибку компиляции, потому что метод Append не соответствует требуемой сигнатуре (он возвращает ссылку обратно на StringBuilder, а не пустоту, как хочет мой метод):
'System.Text.StringBuilder System.Text.StringBuilder.Append(string)' имеет неправильный тип возврата
Не думая, я изменил код на это:
var output = new StringBuilder();
DoStuff(s => output.Append(s));
Этот скомпилированный файл.
Тогда я запутался; понимая, что s => output.Append(s) должен также возвращать StringBuilder, не являются ли они одинаковыми?
Итак, почему это работает? Зачем s => output.Append(s) вернуть возвращаемое значение молча, но output.Append не может?