2013-02-26 5 views
1

По некоторым причинам Visual Studio имеет проблемы с этой линией:Convert.ToInt32 работает в выражении if, но не с? Оператор

MandatoryStakeholder.SupportDocTypeID = (String.IsNullOrEmpty(allIDValues[1]) || (allIDValues[1] == "0")) ? null : Convert.ToInt32(allIDValues[1]); 

конкретно Convert.ToInt32(allIDValues[1]) части. Ошибка «C#: Эти типы не совместимы„нулевой“:" ВНУТР»

Однако, если я эмулировать эту логику ниже него не проблема:

if (string.IsNullOrEmpty(allIDValues[1]) || Convert.ToInt32(allIDValues[1]) == 0) 
       stakeHolder.SupportDocTypeId = null; 
      else 
       stakeHolder.SupportDocTypeId = Convert.ToInt32(allIDValues[1]); 

MandatoryStakeholder.SupportDocTypeID имеет тип Int? , Не уверен, почему я могу преобразовать строку в int в выражении if, но не с? оператор.

+1

Я считаю, что тройка должна иметь одинаковый тип возврата в обеих ветвях. Таким образом, вам нужен «int?», То есть «null», а не просто «null». – FlyingStreudel

ответ

3

Попробуйте отливку null к int?

MandatoryStakeholder.SupportDocTypeID = 
    (String.IsNullOrEmpty(allIDValues[1]) || (allIDValues[1] == "0")) ? 
     (int?)null : 
     Convert.ToInt32(allIDValues[1]); 
3

Изменить ? null на ? (int?) null.

MandatoryStakeholder.SupportDocTypeID = (String.IsNullOrEmpty(allIDValues[1]) || (allIDValues[1] == "0")) ? (int?)null : Convert.ToInt32(allIDValues[1]); 
2

Это потому, что в случае версии,

stakeHolder.SupportDocTypeId = Convert.ToInt32(allIDValues[1]); 

молча преобразуются в

stakeHolder.SupportDocTypeId = new int?(Convert.ToInt32(allIDValues[1])); 

Чтобы получить тройной эквивалент, вам необходимо изменить свой код на:

MandatoryStakeholder.SupportDocTypeID = (String.IsNullOrEmpty(allIDValues[1]) || (allIDValues[1] == "0")) ? null : new int?(Convert.ToInt32(allIDValues[1])); 
Смежные вопросы