Я заметил что-то странное при попытке передать метод 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
не может?