Resharper可能在XElement Element方法上引用空引用警告

时间:2014-09-18 12:37:33

标签: c# xelement resharper-8.2

Resharper在它被解析为null(TransformElementBad方法)之后为Element方法调用提供了一个可能的空引用警告,但是如果我将元素值保留在某个变量中,则一切正常。 ReSharper是对的,我应该使用它的建议还是一个bug?

// JetBrains ReSharper 8.2.1 
// Build 8.2.1000.4556 on 2014-05-19T09:12:38

public class Transformer
{
    private void TransformElementBad(XElement field)
    {
        var format = string.Empty;

        if (field.Element("ViewFormatInfo") != null)
            format = field.Element("ViewFormatInfo").Value.Trim(); // ![got][1] warning here

        Console.WriteLine(format);
    }

    private void TransformElementGood(XElement field)
    {
        var format = string.Empty;

        var element = field.Element("ViewFormatInfo");
        if (element != null)
            format = element.Value.Trim();

        Console.WriteLine(format);
    }
}

3 个答案:

答案 0 :(得分:1)

Value可能是null,这就是它发出警告的原因,因此您必须在致电null之前检查Trim(),如果确定在那里将永远是Value,然后不需要空检查。

format = field.Element("ViewFormatInfo").Value !=null ? field.Element("ViewFormatInfo").Value.Trim() : string.Empty; 

答案 1 :(得分:1)

来自供应商的回答:元素方法不纯,在给定相同参数的情况下无法返回相同的结果。因此,如果要避免此警告,则必须将其结果复制到局部变量中  https://youtrack.jetbrains.com/issue/RSRP-424149

答案 2 :(得分:0)

我不是要在这里进行挖墓,但是由于没有解决方案(仅对此行为的解释),因此不妨与该主题分享我的想法。

因此,尽管我无法就JetBrains对此问题的立场提出异议,但我注意到您可以在C#6和更高版本的null-conditional access中避免这种令人讨厌的警告:

var format = field.Element("ViewFormatInfo")?.Value.Trim();

还请注意

  

空条件运算符正在短路。也就是说,如果条件成员或元素访问操作链中的一个操作返回null,则该链的其余部分将不执行。

这意味着使用空条件在Trim()属性上调用Value方法不会抛出NullReferenceException(好像Value本身为空),而只是将null返回给呼叫者;