Возможное непреднамеренное сравнение ссылок
У меня есть следующий код, который дает предупреждение
Возможное непреднамеренное сравнение ссылок; чтобы получить сравнение значений, введите левую сторону, чтобы ввести "string"
if (lblStatus.Content == "ACTIVE")
{
//Do stuff
}
else
{
//Do other Stuff
}
Я предполагаю, что предупреждение состоит в том, что lblStatus.Content
может не всегда иметь строку типа?
Я попытался исправить это, используя каждое из следующих, но я все еще получаю предупреждение
if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")
if (lblStatus.Content === "ACTIVE")
Пожалуйста, может кто-нибудь объяснить причину, по которой я все еще получаю предупреждение и лучший практический способ справиться с этим?
Ответы
Ответ 1
Предупреждение связано с тем, что тип lblStatus.Content
времени компиляции object
. Поэтому перегрузка оператора выбирает перегрузку ==(object, object)
, которая является просто сопоставлением ссылочного идентификатора. Это не имеет никакого отношения к типу значения времени выполнения.
Первая или вторая из ваших опций должна была зафиксировать предупреждение, хотя:
if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")
Обратите внимание, что первый из них генерирует исключение, если lblStatus.Content
имеет значение null. Я бы предпочел вторую форму.
Если вы думаете, что по-прежнему видите предупреждение в этот момент, я подозреваю, что вы либо не перестроили, либо что-то еще "грязно" в вашей сборке. Полная перестройка абсолютно должна удалить предупреждение.
Ответ 2
Я предпочитаю придерживаться метода string.Equals(string,string,StringComparison)
, как показано ниже:
string contentStr = (lblStatus.Content ?? string.Empty).ToString();
if (string.Equals("ACTIVE", contentStr, StringComparison.OrdinalIgnoreCase))
{
// stuff
}
потому что он явно указывает, что он делает +, он не дает предупреждения, о котором вы упомянули.
Ответ 3
Восстановите свой проект после исправления кода следующим образом:
if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")
if (lblStatus.Content === "ACTIVE")