代码之家  ›  专栏  ›  技术社区  ›  lance

无法将异常强制转换为ArgumentException?

  •  0
  • lance  · 技术社区  · 14 年前
    ArgumentException argumentException = (ArgumentException)new Exception();
    

    抛出:

    System.InvalidCastException异常:无法强制转换类型为“”的对象系统异常'到类型'System.ArgumentException异常'.

    为什么我不能将一个异常(我认为定义较少)转换为一个ArgumentException(我认为定义较多)?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    14 年前

    这就像在尝试:

    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 -但我们暂时也不谈这些。)

        2
  •  4
  •   Adam Robinson    14 年前

    因为你在创造一个 Exception Argument 后代 你正在实例化的类型。您可以这样做:

    Exception ex = new ArgumentException();
    

    但你不能这么做:

    ArgumentException ex = (ArgumentException)new Exception();
    
        3
  •  1
  •   sbi    14 年前

    为什么我不能将一个异常(我认为定义较少)转换为一个ArgumentException(我认为定义较多)?