конкатенация действия со строкой с использованием динамики - PullRequest
5 голосов
/ 11 ноября 2011

У меня есть следующий код в C #:

Action a = new Action(() => Console.WriteLine());
dynamic d = a;
d += "???";
Console.WriteLine(d);

и вывод

System.Action ???

в то время как если вы добавите int вместо строки к d, это вызовет исключение.

Не могли бы вы объяснить, почему это происходит?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Я думаю, что это происходит потому, что при использовании d += "???"; d преобразуется в строку (используется метод ToString() по умолчанию, который принимает имя объекта), а затем "???" добавляется и записывается в консоль.
Если вы попытаетесь использовать d += 2, это не удастся, потому что нет способа по умолчанию преобразовать действие в целое число. То же самое для других типов ...

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

Добавление string к чему-либо в .NET вызовет метод этой вещи .ToString и будет рассматривать добавление как конкатенацию строк. То же самое произошло бы, если бы вы не использовали dynamic.

Action a = new Action(() => Console.WriteLine());
Console.WriteLine(a + "???"); // outputs "System.Action???"

Любой Action вернет System.Action при вызове метода .ToString.

Единственная разница между += в исходном примере и + в этом примере состоит в том, что вы устанавливаете результат объединения в динамическую переменную. Это будет эквивалентно:

object a = new Action(() => Console.WriteLine());
a = a + "???"; // The same as: a = a.ToString() + "???";
Console.WriteLine(a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...