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