Следующий код не будет компилироваться:
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;
Мне кажется, что, когда тройные ветки имеют разные типы, компилятор не будет автоматически определять значения для объекта типа... но когда они имеют один и тот же тип, автооблок автоматически.
На мой взгляд, первое утверждение должно быть законным...
Может ли кто-нибудь описать, почему компилятор не позволяет этого и почему разработчики С# решили сделать это? Я считаю, что это законно на Java... Хотя я этого не подтвердил.
Спасибо.
EDIT: Я прошу понять, почему Java и С# обрабатывают это по-другому, что происходит под сценами на С#, которые делают это недопустимым. Я знаю, как использовать тернар, и я не ищу "лучший способ" для кода примеров. Я понимаю правила тройного в С#, но я хочу знать, ПОЧЕМУ...
РЕДАКТИРОВАТЬ (Jon Skeet): Удален тег "autoboxing", так как в этом вопросе не участвует ни один бокс.