2009-03-15 2 views
47

У меня есть параметр «необязательный» для метода, который является KeyValuePair. Я хотел перегрузку, которая проходит нуль в основном способ для этого параметра, но в основном способе, когда я хочу, чтобы проверить, если KeyValuePair имеет нулевое значение, я получаю следующее сообщение об ошибке:Как объект нельзя сравнивать с нулевым?

Operator '!=' cannot be applied to operands of type System.Collections.Generic.KeyValuePair<string,object>' and '<null>. 

Как я могу не быть разрешено проверять, является ли объект нулевым?

+0

Можете ли вы привести пример кода, который показывает эту ошибку? –

+2

См. Также: http://stackoverflow.com/questions/1335419/how-can-i-make-sure-that-firstordefaultkeyvaluepair-has-returned-a-value – 2011-07-01 03:30:31

ответ

78

KeyValuePair<K,V> - это структура, а не класс. Это как делать:

int i = 10; 
if (i != null) ... 

(Несмотря на то, что на самом деле правовой, с предупреждением, из-за нечетные правила преобразования обнуляемого Важным бит, что условие if никогда не будет истинным.).

Чтобы сделать это «необязательно», вы можете использовать форму:

static void Foo(KeyValuePair<object,string>? pair) 
{ 
    if (pair != null) 
    { 
    } 
    // Other code 
} 

Обратите внимание на? в KeyValuePair<object,string>?

+1

Спасибо, никогда не приходило мне в голову, что это была структура. Duh! – ProfK

+4

"(i! = Null)" генерирует предупреждение, но, к сожалению, нет такого предупреждения для определенного пользователем типа значения, который перегружает Equals/== /! = В соответствии с рекомендациями MSDN. Очень запутанно, когда я реализую «struct Foo», и мой клиент ожидает «if (someFoo! = Null)», чтобы быть разумным способом проверить, имеет ли значение someFoo значение. :-p – yoyo

7

Поскольку KeyValuePair является структурой (тип значения), вы можете сравнивать только нули в ссылочных типах.

Я предполагаю, что вы еще не написали эту дополнительную перегрузку. Он будет терпеть неудачу, если вы попытаетесь передать null в качестве значения KeyValuePair.

3

KeyValuePair < K, V > является структурой и, следовательно, не может быть ни при каких обстоятельствах. Только ссылочный тип может быть нулевым.

Если вы пытаетесь поймать неправильное значение, вам придется проверять элементы ключа и значения отдельно.

-8

Фактически вы можете использовать KeyValuePair.IsNull(), чтобы определить, установлен ли KeyValuePair.

+0

Где вы получаете KeyValuePair.IsNull()? Метод расширения? – Mark

12

Я отвечаю на это, несмотря на свой возраст, потому что это первый Google результат для «тест KeyValuePair обнулить»

Ответ указан правильно, но это не полностью ответить на проблему, по крайней мере, один У меня было, где мне нужно проверить существование KeyValuePair и перейти к другой проверке Dictionary, если она не существует, как я ожидаю.

Используя описанный выше метод не работает для меня, потому что компилятор дроссели на получение KeyValuePair.Value из KeyValuePair<>?, так что лучше использовать default(KeyValuePair<>), как показано в этом вопросе + ответы. The default for KeyValuePair

Смежные вопросы