Чтобы проиллюстрировать мой вопрос, рассмотрим эти тривиальные примеры (С#):
object reference = new StringBuilder();
object box = 42;
object unset = null;
// CASE ONE: bad reference conversions (CIL instrcution 0x74 'castclass')
try
{
string s = (string)reference;
}
catch (InvalidCastException ice)
{
Console.WriteLine(ice.Message); // Unable to cast object of type 'System.Text.StringBuilder' to type 'System.String'.
}
try
{
string s = (string)box;
}
catch (InvalidCastException ice)
{
Console.WriteLine(ice.Message); // Unable to cast object of type 'System.Int32' to type 'System.String'.
}
// CASE TWO: bad unboxing conversions (CIL instrcution 0xA5 'unbox.any')
try
{
long l = (long)reference;
}
catch (InvalidCastException ice)
{
Console.WriteLine(ice.Message); // Specified cast is not valid.
}
try
{
long l = (long)box;
}
catch (InvalidCastException ice)
{
Console.WriteLine(ice.Message); // Specified cast is not valid.
}
try
{
long l = (long)unset;
}
catch (NullReferenceException nre)
{
Console.WriteLine(nre.Message); // Object reference not set to an instance of an object.
}
Итак, в тех случаях, когда мы пытаемся выполнить ссылочное преобразование (соответствующее инструкции CIL castclass
), созданное исключение содержит отличное сообщение формы:
Невозможно применить объект типа "X" к типу "Y".
Эмпирические данные показывают, что это текстовое сообщение часто чрезвычайно полезно для (опытного или неопытного) разработчика (исправителя ошибок), которому необходимо решить проблему.
Напротив, сообщение, которое мы получаем, когда попытка попытки распаковки (unbox.any
) терпит неудачу, довольно неинформативна. Есть ли какая-либо техническая причина, почему это должно быть так?
Указанный приказ недействителен. [НЕ ПОМОЩЬ]
Другими словами, почему мы не получаем сообщение типа (мои слова):
Невозможно удалить объект типа "X" в значение типа "Y"; два типа должны согласиться.
соответственно (мои слова снова):
Невозможно удалить ненулевую ссылку в значение типа NULL с нулевым значением.
Итак, чтобы повторить мой вопрос: "Случайно", что сообщение об ошибке в одном случае является хорошим и информативным, а в другом случае бедным? Или есть техническая причина, по которой было бы невозможно или было бы трудно или трудно, чтобы среда выполнения предоставляла детали фактических типов, встречающихся во втором случае?
(Я видел пару потоков здесь, на SO, которые, я уверен, никогда бы не спросили, был ли текст исключения для неудачных распаковщиков лучше.)
Обновление: ответ Дэниела Фредерико Линса Лейта привел к тому, что он открыл проблему в CLR Github (см. ниже). Это было обнаружено как дубликат более ранней версии (поднятой Джоном Скитом, люди почти догадывались об этом!). Поэтому не было веской причины для сообщения о бедных исключениях, и люди уже исправили его в CLR. Поэтому я не был первым, кто задумался об этом. Мы с нетерпением ждем того дня, когда это улучшение будет отправлено в .NET Framework.