所以,让我解释一下我的麻烦。
我得到了一个由另一个人开发的项目,他离开了公司。现在我必须更新程序,但在导入解决方案时出现问题。
让我们看看代码:
ListeDeTypeDePoste = (from e in xml.Descendants("profil")
select new TypeDePoste()
{
Nom = e.Element("name").Value,
Chaines = (from c in e.Elements("Chaine")
select new Chaine()
{
Code = c.Element("Code")?.Value,
Type = c.Element("Type")?.Value,
Nom = c.Element("Nom")?.Value,
OU = c.Element("OU")?.Value
}).ToList()
}).ToList<TypeDePoste>();
问题在于.?Value
对于Chaine类中的每个属性,当我调试时我甚至可以调试解决方案,如果我删除它们我得到NullReferenceException。使用此代码,以前的realese .exe就像魅力
答案 0 :(得分:1)
您只能在?.
。
C# 6.0
这是null-propagation
运营商。如果您不想使用它,可以将作业更改为Chaine
类的属性:
select new Chaine()
{
Code = (c.Element("Code") == null) ? null : c.Element("Code").Value,
Type = (c.Element("Type") == null) ? null : c.Element("Type").Value,
Nom = (c.Element("Nom") == null) ? null : c.Element("Nom").Value,
OU = (c.Element("OU") == null) ? null : c.Element("OU").Value
}).ToList()
如果您在此运算符中删除?
,则分配将因为您尝试获取null
的值而崩溃。
如果c.Element(“Code”)为null,则此代码将简单地为代码分配null:
Code = c.Element("Code")?.Value;
但没有?
:
Code = c.Element("Code").Value; //app will throw an exception because c.Element("Code") is null
答案 1 :(得分:1)
这是因为该代码中的Element
次调用有时会返回null
,因为具有给定名称的元素不会存在于您所在的XML文档中的该位置处理
?.
(null-conditional)运算符对此进行测试,在这种情况下返回null
。
如果您改为使用.
(不添加自己的null
检查),则会在这种情况下抛出 NullReferenceException 。这是在C#中设计的。
空条件运算符为introduced in C# 6,因此要使用它,您需要安装Visual Studio 2015。