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

时间:2011-11-10 22:10:23

标签: c# c#-4.0

我在C#中有以下代码:

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

,输出

System.Action ???

如果你向d添加一个int而不是一个字符串,它会抛出异常。

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

2 个答案:

答案 0 :(得分:3)

我认为这是因为当你使用d += "???";时d被转换为字符串(使用默认的ToString()方法,它取对象名称)然后“???”附加并写入控制台 如果您尝试使用d += 2,则会失败,因为没有将Action转换为整数的默认方式。其他类型相同......

答案 1 :(得分:2)

向.NET中的任何内容添加string将导致调用该事物的.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);