Не можете привести Исключение к ArgumentException? - PullRequest
0 голосов
/ 22 сентября 2010
ArgumentException argumentException = (ArgumentException)new Exception();

throws:

System.InvalidCastException: невозможно преобразовать объект типа 'System.Exception' в тип 'System.ArgumentException'.

Почему я не могу привести исключение(меньшее определение, я думаю) для ArgumentException (большее определение, я думаю)?

Ответы [ 3 ]

6 голосов
/ 22 сентября 2010

Это все равно что пытаться сделать:

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 - но мы также оставим их вне этого для момент.)

4 голосов
/ 22 сентября 2010

Поскольку вы создаете Exception объект, а не Argument исключение.Вы пытаетесь привести объект к потомку того типа, который вы создаете.Вы можете сделать это:

Exception ex = new ArgumentException();

Но вы не можете сделать это:

ArgumentException ex = (ArgumentException)new Exception();
1 голос
/ 22 сентября 2010

Почему я не могу привести исключение (меньшее определение, я думаю,) к ArgumentException (большее определение, я думаю)?

Потому что эта дополнительная информация («большее определение») должна откуда-то приходить. Вы можете разыгрывать от основания к производному, только если база фактически является замаскированным производным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...