Одна строка, если оператор генерирует ошибку приведения - PullRequest
0 голосов
/ 04 марта 2012

плохо знаком с C #, поэтому у меня возникла проблема с кратким заявлением. Я хочу конвертировать ...

if (m_dtLastLogin == null)
    drow["LastLogin"] = DBNull.Value;
else
    drow["LastLogin"] = m_dtLastLogin;

до

drow["LastLogin"] = (m_dtLastLogin == null) ? System.DBNull.Value : m_dtLastLogin;

Длинная версия отлично работает, однако сокращенная версия генерирует ошибку «Тип условия не может быть определен, поскольку не существует неявного преобразования между« System.DBNull »и« System.DateTime? »». Мой код поддержки в основном ...

private DateTime? m_dtLastLogin;
m_dtLastLogin = null;
DataRow drow;
drow = m_oDS.Tables["Users"].Rows[0];

Может кто-нибудь помочь мне с короткой рукой здесь?

Ответы [ 2 ]

5 голосов
/ 04 марта 2012

Ну, сообщение об ошибке довольно ясно. Компилятор должен определить тип всего выражения x? Y: z. Если y и z имеют одинаковый тип, это легко. Если y конвертируемо в z, тип выражения является типом z, аналогично, если z конвертируемо в y, тип является типом y.

В вашем случае тип y - это DBNull, тип y - это тип m_dtLastLogin (возможно, datetime). Эти два типа не могут быть преобразованы друг в друга и не имеют общего базового типа (кроме Object), поэтому компилятор не знает, что делать.

Вы можете помочь компилятору, приведя y или z к объекту:

drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : m_dtLastLogin;

или

drow["LastLogin"] = (m_dtLastLogin == null) ? System.DBNull.Value : (object)m_dtLastLogin;

Таким образом, все выражение имеет тип объекта, который затем может быть присвоен drow["LastLogin"].

Справка: Спецификация языка C # - http://www.ecma -international.org / публикации / файлы / ECMA-ST / Ecma-334.pdf

Раздел 14.13, Условный оператор

Цитата

Второй и третий операнды оператора?: Управляют типом условного выражения. Пусть X и Y будут типами второго и третьего операндов. Тогда

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

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

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

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

0 голосов
/ 04 марта 2012

Приведите оба к "объекту":

drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : 
    (object)m_dtLastLogin;

Условный оператор требует, чтобы обе части (часть «then» и «else») имели одинаковый тип, который будет типом результата выражения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...