2012-05-14 3 views
1

Почему компилятор не может автоматически преобразовать значения в это выражение правильно?C# Преобразование типа термического выражения

var input = "Hello"; 
object x = string.IsNullOrEmpty(input) ? input : DBNull.Value; 

//could try this too and get similar compile time error 
object x2 = string.IsNullOrEmpty(input) ? 1 : input; 

Я понимаю, что DBNull.Value нельзя отнести к строке; Тем не менее, мне любопытно, почему он не может быть объединен с объектом, потому что результат просто сохраняет ссылку. Если вы разместите (object) перед DBNull.Value, он будет компилироваться и работать просто отлично.

+0

Все ответы на gdoron являются отсутствующими точки, кроме. Это не вопрос «эй, помоги мне составить этот компилятор». Это больше спрашивает, почему компилятор C# не способен или не хочет смотреть на тип переменной, назначаемой по сравнению с типами переменных во 2-м и 3-м параметрах. –

+0

Нашел этот ответ на несколько несвязанный вопрос http://stackoverflow.com/a/2215959/186359 Я думаю, что это в основном доказывает, что при оценке выражения вы не можете добавлять информацию (тип переменной назначения). Я думаю, что это может быть реальный ответ. –

ответ

2

Фикс его:

string x = string.IsNullOrEmpty(input) ? 
             input : 
             DBNull.Value.ToString(); 

Я нашел это отличные объяснения в Эрик Липпертblog:

спецификация для ?: оператора состояний следующие:

Второй и третий операнды оператора?: управляет типом условным выражением. Пусть X и Y - типы второго и третьих операндов. Затем

  • Если X и Y имеют одинаковый тип, то это тип условного выражения .

  • В противном случае, если неявное преобразование существует от X до Y, , но не от Y до X, то Y является типом условного выражения.

  • В противном случае, если неявное преобразование существует от Y до X, но не от от X до Y, то X является типом условного выражения.

  • В противном случае не может быть определен тип выражения, и возникает ошибка времени компиляции.

В этом случае:

  • string и DBNull не тот же тип.
  • string не имеет неявное преобразование в DBNull
  • DBNull не имеет неявное преобразование в string

Таким образом, мы в конечном итоге с ошибкой времени компиляции.

Компилятор не проверяет, что такое тип, который может «удерживать» эти два типа.

+1

Это имеет смысл. Я думаю, что я искал «неявную» часть. Kinda заставляет вас задаться вопросом, почему он не пытается и не подразумевает преобразование в тип переменной, которую они назначают. Если я храню объект, мне все равно, что такое фактический тип, так как я просто сохраняю ссылку на него в любом случае. –

+0

@MattPhillips. Тогда вы его нашли ... :) – gdoron

3

Это потому, что string не подлежит замене на DbNull и наоборот. При использовании тернарного оператора оба результирующих операнда должны быть совместимы.

+0

Я бы обьявил это с помощью _ «Там должно быть неявное преобразование из одного из типов в другое». _ – gdoron

+0

@gdoron также нет явного преобразования. – Matthew

+0

Я уже получаю эту часть. Мне интересно, почему невозможно (возможно) для компилятора посмотреть на тип, которому присвоен (объект), и понять, что оба эти типа имеют неявное преобразование в объект. Забудьте о том, что они имеют друг другу. –

2

Помощь компилятор найти общий базовый тип вы хотите, как это:

object x = string.IsNullOrEmpty(input) ? (object)input : DBNull.Value;