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