使用动态将动作与字符串连接起来

本文关键字:字符串 连接 起来 动态 | 更新日期: 2023-09-27 18:14:26

我有以下c#代码:

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

,输出为

System.Action ? ?

而如果在d中添加int而不是string,则会抛出异常。

你能解释一下为什么会这样吗?

使用动态将动作与字符串连接起来

我认为这是因为当你使用d += "???";时,d被转换为字符串(使用默认的ToString()方法,它接受对象名称),然后"???"被附加并写入控制台。
如果你尝试使用d += 2,这将失败,因为没有默认的方法将Action转换为整数。

在。net中添加string将导致该事物的.ToString方法被调用,并将添加视为字符串连接。如果你不使用dynamic,同样的事情也会发生。

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

.ToString方法被调用时,任何Action都将返回System.Action

原始示例中的+=与本示例中的+之间的唯一区别是您将连接的结果设置为动态变量。它相当于:

object a = new Action(() => Console.WriteLine());
a = a + "???"; // The same as: a = a.ToString() + "???";
Console.WriteLine(a);