Используйте нуль-слитый оператор c # с int - PullRequest
3 голосов
/ 08 июля 2011

Я пытаюсь использовать оператор объединения нулей в int. Это работает, когда я использую его на строки

UserProfile.Name = dr["Name"].ToString()??"";

Когда я пытаюсь использовать его на int как этот

UserProfile.BoardID = Convert.ToInt32(dr["BoardID"])??default(int);

Я получаю это сообщение об ошибке

Оператор '??' не может применяться к операнды типа 'int' и 'int'

Я нашел этот пост в блоге, где он используется http://davidhayden.com/blog/dave/archive/2006/07/05/NullCoalescingOperator.aspx с типом данных int. Может кто-нибудь сказать, что я делаю не так?

Ответы [ 6 ]

7 голосов
/ 08 июля 2011

Я подозреваю, что вы действительно пытаетесь установить BoardID в 0, если dr ["BoardID"] равен NULL из базы данных.Потому что если dr ["BoardID"] равен NULL, Convert.ToInt32 завершится с ошибкой.Попробуйте это:

UserProfile.BoardID = (dr["BoardID"] is DbNull) ? 0 : Convert.ToInt32(dr["BoardID"]);
5 голосов
/ 08 июля 2011

Да, конечно ... потому что int не может быть нулевым.
Он имеет только 32 бита, и все комбинации представляют действительное целое число.

Вместо этого используйте int?, еслиВы хотите обнуляемость.(Это сокращение от System.Nullable<int>.)

4 голосов
/ 08 июля 2011

int никогда не бывает null, поэтому применять ?? к нему не имеет смысла.

Один из способов добиться того, чего вы хотите, это TryParse:

int i;
if(!int.TryParse(s, out i))
{
    i = 0;
}

Или, так как вы хотите получить 0 или default(int), вы можете выбросить if, поскольку выходной параметр TryParse в случае ошибки уже равен default(int):

int i;
int.TryParse(s, out i);

В статье, на которую вы ссылаетесь, нет int слева от ??, но int?. Это сокращение для Nullable<int>, которое поддерживает null, поэтому ?? имеет смысл с ним.

int? count = null;    
int amount = count ?? default(int); //count is `int?` here and can be null
1 голос
/ 08 июля 2011

В вашей ссылке ?? оператор применяется к Nullable<int> (int?), который может иметь нулевое значение.

Оператор обнуления работает следующим образом:

Если значение слева от оператора равно нулю, вернуть значение справа от оператора. Int является типом значения, поэтому он никогда не может иметь нулевое значение. Вот почему вы получаете ошибку.

0 голосов
/ 08 июля 2011

В примере вы связали строки с оператором ?? на int:

int? count = null;

int amount = count ?? default(int);

Следовательно, в этом примере int имеет значение nullable

0 голосов
/ 08 июля 2011

Вы можете использовать оператор объединения нулей только для ссылочных типов или типов значений, допускающих значение NULL.Например: string или int? См. http://msdn.microsoft.com/en-us/library/ms173224.aspx

...