无法将Exception强制转换为ArgumentException?

时间:2010-09-22 13:56:19

标签: c# exception casting

ArgumentException argumentException = (ArgumentException)new Exception();

抛出:

System.InvalidCastException:无法将类型为“System.Exception”的对象强制转换为“System.ArgumentException”。

为什么我不能将一个Exception(更少的定义,我认为)转换为ArgumentException(更多定义,我认为)?

3 个答案:

答案 0 :(得分:6)

这就像试图做的那样:

FileStream stream = (FileStream) new object();

它会从哪个文件读取或写入?

如果实际对象是该类型或在其层次结构中具有该类型,则只能转换对类型的引用。所以这将有效:

Exception exception = new ArgumentException();
ArgumentException argumentException = (ArgumentException) exception;

这也可行:

Exception exception = new ArgumentOutOfRangeException();
// An ArgumentOutOfRangeException *is* an ArgumentException
ArgumentException argumentException = (ArgumentException) exception;

但是您的示例不会,因为仅System.Exception 的实例不是 System.ArgumentException的实例。

请注意,这与异常无关,实际上 - 所有引用类型都应用相同的逻辑。 (对于值类型,还要考虑装箱/拆箱。哦,还有可能是用户定义的转换,例如从XElementstring - 但我们会留下那些暂时也离开它。)

答案 1 :(得分:4)

因为您正在创建Exception对象,而不是Argument例外。您正在尝试将对象强制转换为您要实例化的类型的后代。你可以这样做:

Exception ex = new ArgumentException();

但你不能这样做:

ArgumentException ex = (ArgumentException)new Exception();

答案 2 :(得分:1)

  

为什么我不能将一个Exception(更少的定义,我认为)转换为ArgumentException(更多定义,我认为)?

因为附加信息(“更多定义”)必须来自某个地方。当基本实际上是伪装派生时,你只能从基础转换为派生。