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);
}
}
答案 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返回给呼叫者;