Ну, сообщение об ошибке довольно ясно. Компилятор должен определить тип всего выражения 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 является типом условного выражения.
В противном случае тип выражения не может быть определен и возникает ошибка времени компиляции.