【问题标题】:Error if XElement goes to Null [duplicate]如果 XElement 变为 Null 则出错 [重复]
【发布时间】:2018-04-27 08:25:22
【问题描述】:

我有以下代码:

var te = doc.Descendants("TESTID").Where(x=> (string)x.Attribute("TESTIDNumber")= finalstr).FirstOrDefault();

te is null 的情况下,下面给出一个例外:

var ignorete = doc.Descendants("IgnoreTESTID").Where(x=> (string)x.Attribute("TESTIDNumber")== te.FirstAttribute.Value.toString();

例外是:Object not set to an instance of the Object

如果te 变为空,我如何使ignorete 变为空?

【问题讨论】:

  • 你希望null.FirstAttribute.Value.toString() 做什么?
  • 不要那样做 :)
  • 您似乎发布了一个观察结果,而不是一个问题。是的,你是对的,当te is null 那行代码会产生异常。还有?
  • var ignorete = (te == null) ? null : doc.Descendants("IgnoreTESTID").Where(x=> etc
  • @JohnWu for C#6 及更高版本var ignorete = te ?? doc.Descendants("IgnoreTESTID").Where(x=> etc

标签: c# .net xml


【解决方案1】:

你只需要一个保护子句:

public string GetIgnorete()
{
    var te = doc.Descendants("TESTID").Where(x=>  (string)x.Attribute("TESTIDNumber") == finalstr).FirstOrDefault();
    if ( te == null ) return null;
    return doc.Descendants("IgnoreTESTID").Where(x=> (string)x.Attribute("TESTIDNumber") == te.FirstAttribute.Value.toString();
}

或者你可以使用conditional operator:

var ignorete = (te == null) ? null : doc.Descendants("IgnoreTESTID").Where( x => etc –

注意:我冒昧地将您的 = 更改为 ==。后者是基于比较产生布尔值的相等运算符。前者是赋值运算符,其结果是赋值的值。

【讨论】:

  • (string)x.Attribute("TESTIDNumber")= te.FirstAttribute.Value.toString();?
  • 此答案中的代码将不起作用。它使用赋值运算符 = 而不是比较运算符 == 并且缺少大括号 .Where(x=> (string)x.Attribute("TESTIDNumber")= te.FirstAttribute.Value.toString();
【解决方案2】:

您不能,因为必须实例化 var,以便 C# 可以分配类型。您不能创建 var 对象并将其设置为 null。

在这种情况下,您需要将其声明为 doc.Descendants 返回的任何对象类型。我在下面声明为通用object

object ignorete = te != null ? doc.Descendants("IgnoreTESTID").Where(x=> (string)x.Attribute("TESTIDNumber")= te.FirstAttribute.Value.toString()) : null;

【讨论】:

  • (string)x.Attribute("TESTIDNumber")= te.FirstAttribute.Value.toString();?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多