可能的意外参考比较

时间:2012-09-04 12:41:12

标签: c#

我有以下代码,它会发出警告

  

可能的意外参考比较;要获得值比较,请将左侧投射到“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")

请有人解释一下我仍然会收到警告的原因以及处理此问题的最佳实用方法吗?

3 个答案:

答案 0 :(得分:58)

警告是因为lblStatus.Content编译时类型为object。因此,运算符重载会选择==(object, object)重载,这只是一个参考标识比较。这与值的执行时间类型无关。

您的第一个或第二个选项应该已修复警告:

if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")

请注意,如果lblStatus.Content为null,则第一个将抛出异常。我更喜欢第二种形式。

如果您认为此时仍然看到警告,我怀疑您要么没有重建 - 或者您的构建中仍然存在“脏”。完全重建绝对应删除警告。

答案 1 :(得分:1)

我更喜欢坚持string.Equals(string,string,StringComparison)方法,如下所示:

    string contentStr = (lblStatus.Content ?? string.Empty).ToString();
    if (string.Equals("ACTIVE", contentStr, StringComparison.OrdinalIgnoreCase))
    { 
        // stuff
    } 

因为它明确说明了它的作用+它没有给出你提到过的警告。

答案 2 :(得分:-2)

使用以下代码修复代码后重建项目:

if (lblStatus.Content.ToString() == "ACTIVE")
if ((string)lblStatus.Content == "ACTIVE")
if (lblStatus.Content === "ACTIVE")