Подтвердить что ты не робот

Если существует преобразование идентичности от S до T, должно быть, что S и T являются одним и тем же типом?

В 6.1.6. спецификации языка С#, есть:

Неявные ссылочные преобразования:

(...)
От любого ссылочного типа к ссылочному типу T, если он имеет неявное преобразование идентичности или ссылки в ссылочный тип T0 и T0, имеет преобразование идентичности в T.

Почему бы им не сказать вместо этого более просто:

От любого ссылочного типа до ссылочного типа T, если он имеет неявное идентификационное или ссылочное преобразование в T.

Есть ли какая-то фактическая разница?

EDIT: я понял, что я ошибся в спецификации, и ошибка может быть существенной для вопроса (спецификация говорит "Неявное преобразование ссылок", а не "Неявное преобразование существует" )

4b9b3361

Ответ 1

Если существует преобразование идентичности от S до T, должно быть, что S и T являются одним и тем же типом?

Необычность, которую вы обнаружили в спецификации, возникла в результате добавления dynamic к языку в С# 4.0. Во время выполнения нет такой вещи, как dynamic; скорее, dynamic - это просто тип, который означает "Я действительно object, пожалуйста, отложите анализ этой части программы до времени исполнения".

Поэтому существует преобразование идентичности между, скажем, List<object> и List<dynamic>. С точки зрения компилятора С# они разные, потому что myList[0].Frob() даст ошибку для первого, а не последнего. Но с точки зрения времени они идентичны. Поэтому язык С# классифицирует преобразование из одного в другое как преобразование идентичности. Во время компиляции типы могут быть разными для целей языка С#, но с точки зрения времени выполнения они будут идентичными.