C # Nullable Ints - Ошибка компиляции

Почему

            int? nullInt = null;
            base.Response.Data = (new BusinessLogic.RefDataManager(base.AppSettingsInfo)).SelectAppData(new DC.AppData() { AppDataKey = app_data_key != string.Empty ? app_data_key : null, AppDataTypeId = app_data_type_id != string.Empty ? int.Parse(app_data_type_id) : nullInt });

компилировать, но это

            base.Response.Data = (new BusinessLogic.RefDataManager(base.AppSettingsInfo)).SelectAppData(new DC.AppData() { AppDataKey = app_data_key != string.Empty ? app_data_key : null, AppDataTypeId = app_data_type_id != string.Empty ? int.Parse(app_data_type_id) : null});

не? Ошибка компиляции для второго оператора: «Тип условного выражения не может быть определен, потому что не существует неявного преобразования между 'int' и null»

DC.AppData - это

public class AppData
{
    [DataMember(Name = "AppDataKey")]
    public string AppDataKey { get; set; }

    [DataMember(Name = "AppDataTypeId")]
    public int? AppDataTypeId { get; set; }


}

person Scott    schedule 04.02.2015    source источник
comment
Зачем запихивать все это в одну строку, если бы вы просто использовали несколько строк, это было бы более читаемым, и у вас нет таких проблем.   -  person Scott Chamberlain    schedule 04.02.2015


Ответы (2)


Тернарный оператор в C # не верит, что вы имеете в виду null как int?. Вы должны явно указать компилятору C #, что вы имеете в виду null как _4 _...

base.Response.Data = (new BusinessLogic.RefDataManager(base.AppSettingsInfo)).SelectAppData(new DC.AppData() { AppDataKey = app_data_key != string.Empty ? app_data_key : null, AppDataTypeId = app_data_type_id != string.Empty ? int.Parse(app_data_type_id) : (int?)null});

... или что int.Parse(app_data_type_id) - это int?, кастуя его ...

(int?)int.Parse(app_data_type_id)

Любой из тернарных операндов yield должен быть явно приведен к int?.

person Nick Strupat    schedule 04.02.2015

Проблема здесь:

app_data_type_id != string.Empty ? int.Parse(app_data_type_id) : null

int.Parse возвращает int, который не допускает значения NULL

вам нужно преобразовать его как int?

(int?) int.Parse(app_data_type_id) : null
person bluetoft    schedule 04.02.2015
comment
Фактически, оба наших ответа предоставляют рабочее решение. Кажется, что любой из тернарных операндов yield должен быть явно int?, но не оба одновременно. - person Nick Strupat; 04.02.2015