Следующий код не компилируется:
string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
Я получаю: Ошибка 1 Тип условного выражения не может быть определен, потому что не существует неявного преобразования между System.DBNull и string
Чтобы исправить это, я должен сделать что-то вроде этого:
string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
Это приведение кажется бессмысленным, поскольку это определенно законно:
string foo = "bar";
Object o = foo == null ? "gork" : foo;
Мне кажется, что когда тройные ветки имеют разные типы, компилятор не будет автоматически упаковывать значения в объект типа ... но когда они одного типа, автобоксирование выполняется автоматически.
На мой взгляд, первое утверждение должно быть законным ...
Может ли кто-нибудь описать, почему компилятор не позволяет этого и почему разработчики C # решили это сделать? Я считаю, что это законно в Java ... Хотя я не проверял это.
Спасибо.
РЕДАКТИРОВАТЬ: Я прошу понять, почему Java и C # обрабатывают это по-разному, что происходит под сценами в C #, которые делают это недействительным. Я знаю, как использовать троичный код, и не ищу «лучшего способа» кодирования примеров. Я понимаю правила тернарности в C #, но хочу знать, ПОЧЕМУ ...
РЕДАКТИРОВАТЬ (Джон Скит): удален тег "autoboxing", поскольку в этом вопросе бокс не используется.