ArgumentException argumentException = (ArgumentException)new Exception();
抛出:
System.InvalidCastException:无法将类型为“System.Exception”的对象强制转换为“System.ArgumentException”。
为什么我不能将一个Exception(更少的定义,我认为)转换为ArgumentException(更多定义,我认为)?
答案 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
的实例。
请注意,这与异常无关,实际上 - 所有引用类型都应用相同的逻辑。 (对于值类型,还要考虑装箱/拆箱。哦,还有还可能是用户定义的转换,例如从XElement
到string
- 但我们会留下那些暂时也离开它。)
答案 1 :(得分:4)
因为您正在创建Exception
对象,而不是Argument
例外。您正在尝试将对象强制转换为您要实例化的类型的后代。你可以这样做:
Exception ex = new ArgumentException();
但你不能这样做:
ArgumentException ex = (ArgumentException)new Exception();
答案 2 :(得分:1)
为什么我不能将一个Exception(更少的定义,我认为)转换为ArgumentException(更多定义,我认为)?
因为附加信息(“更多定义”)必须来自某个地方。当基本实际上是伪装派生时,你只能从基础转换为派生。