我有以下代码:
public static void Main() {
Exception exception = new Exception("1", new Exception("2"));
Exception inner = exception.InnerException;
inner = new Exception("3");
Console.WriteLine(exception);
Console.ReadLine();
}
这应该打印一条带有消息"1"
且内部异常的异常,其中包含消息"3"
但是,在打印时,内部异常会显示消息"2"
。
这怎么可能发生?我不修改参考对象吗?当我致电exception.InnerException
时,该对象的副本是否会返回给我?
答案 0 :(得分:4)
这应该打印一个带有消息“1”且带有内部异常的异常,其中包含消息“3”
不,它不应该 - 因为你没有修改exception
变量所引用的对象。相反,您使用exception
声明变量并为其赋予初始值:
Exception inner = exception.InnerException;
这会将exception.InnerException
(这是一个参考)的值复制到inner
变量。然后在下一行中,您忽略了当前值,只给了inner
一个不同的值:
inner = new Exception("3");
这不会改变exception
的任何内容。事实上inner
的原始值恰好是从exception.InnerException
属性中提取的,这不会影响将新值分配给inner
的所有。你可以写一下:
Exception inner = new Exception("3");
在构造异常后,您无法更改Exception.InnerException
- InnerException
属性是只读的。即使它是可写属性,你的代码也不会做你想要的。相反,你需要:
// This won't work because InnerException is read-only, but it would *otherwise*
// have worked.
excetion.InnerException = new Exception("3");
答案 1 :(得分:0)
我没有修改参考对象吗?
不,你不是。
当我调用exception.InnerException时,是否有对象的副本返回给我?
不,会向您返回参考的副本。
以下是发生的事情:
Exception inner = exception.InnerException;
inner
现在引用 exception.InnerException
也引用的对象。
inner = new Exception("3");
inner
现在引用不同的对象。 id 执行引用的对象未更改。