Насколько я могу судить, ваше наблюдение — это наблюдение, которое я сделал здесь:
http://ericlippert.com/2009/03/03/representation-and-identity/
Есть два основных варианта использования оператора приведения в C#:
(1) В моем коде есть выражение типа B, но у меня больше информации, чем у компилятора. Я утверждаю, что точно знаю, что во время выполнения этот объект типа B на самом деле всегда будет производным типом D. Я сообщу компилятору об этом утверждении, вставив в выражение приведение к D. Поскольку компилятор, вероятно, не может проверить мое утверждение, компилятор может убедиться в его правдивости, вставив проверку во время выполнения в том месте, где я делаю утверждение. Если мое утверждение окажется неточным, CLR выдаст исключение.
(2) У меня есть выражение некоторого типа T, которое, как я точно знаю, не относится к типу U. Однако у меня есть хорошо известный способ связать некоторые или все значения T с «эквивалентным» значением U. Я буду указать компилятору сгенерировать код, который реализует эту операцию, вставив приведение к U. (И если во время выполнения окажется, что не существует эквивалентного значения U для конкретного T, которое у меня есть, мы снова выбрасываем исключение.)
Внимательный читатель заметит, что это противоположности. Ловкий трюк, чтобы иметь оператор, который означает две противоречивые вещи, не так ли?
Итак, очевидно, вы один из тех внимательных читателей, которых я вызвал, которые заметили, что у нас есть одна операция, которая логически означает две довольно разные вещи. Это хорошее наблюдение!
Ваш вопрос, почему это так? Это не хороший вопрос! :-)
Как я много раз отмечал на этом сайте, я не могу удовлетворительно ответить на вопросы почему. Потому что в спецификации указано, что это правильный ответ, но неудовлетворительный. На самом деле спрашивающий обычно ищет краткое изложение процесса разработки языка.
Когда команда разработчиков языка C# разрабатывает функции, дебаты могут продолжаться буквально месяцами, они могут включать дюжину человек, обсуждающих множество различных предложений, каждое со своими плюсами и минусами, что приводит к сотням страниц заметок. Даже если бы у меня была соответствующая информация со встреч конца 1990-х годов об операциях с актерами, которой у меня нет, мне кажется трудным кратко обобщить ее таким образом, который удовлетворил бы первоначального спрашивающего.
Более того, чтобы удовлетворительно ответить на этот вопрос, конечно, пришлось бы обсудить всю историческую перспективу. C# был разработан, чтобы быть сразу же продуктивным для существующих программистов C, C++ и Java, и поэтому он заимствует многие из соглашений этих языков, включая его основные механизмы для операторов преобразования. Чтобы правильно ответить на вопрос, нам также пришлось бы обсудить историю оператора приведения типов в C, C++ и Java. Кажется, слишком много информации, чтобы ожидать ответа на StackOverflow.
Откровенно говоря, наиболее вероятным объяснением является то, что это решение не стало результатом долгих споров о достоинствах различных позиций. Скорее всего, команда языковых дизайнеров обдумала, как это делается в C, C++ и Java, приняла разумную компромиссную позицию, которая не выглядела слишком уж ужасной, и перешла к другим, более интересным делам. Таким образом, правильный ответ был бы почти полностью историческим; почему Ричи разработал оператор приведения так же, как он сделал для C? Я не знаю, и мы не можем спросить его.
Мой вам совет: перестаньте спрашивать, почему? вопросы об истории дизайна языка программирования и вместо этого задавайте конкретные технические вопросы о конкретном коде, вопросы, на которые есть краткие ответы.
person
Eric Lippert
schedule
13.03.2015
B b = obj;
. - person juharr   schedule 13.03.2015