所以我第一次深入研究 Linq to XML(我知道,我落后于时代),到目前为止它非常酷。但是,我遇到了这种非常令人困惑的行为。
我正在解析通用.resx
格式。在其中,您有带有 a和 optionaldata
的标签。这是我最初尝试的代码:value
comment
var items = from str in doc.Root.Descendants("data")
select new ResourceValue
{
Name = str.Attribute("name").Value,
Value = str.Element("value").Value,
Comment=str.Element("comment").Value
};
当然,在我得到元素的地方.value
,comment
它会抛出一个空引用异常。好吧,让我们再试一次。我听说您可以将 XElement 转换为字符串,它会神奇地工作。让我们试试
var items = from str in doc.Root.Descendants("data")
select new ResourceValue
{
Name = str.Attribute("name").Value,
Value = str.Element("value").Value,
Comment=str.Element("comment") as string
};
哦。这次我得到一个编译器错误。
无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型“System.Xml.Linq.XElement”转换为“字符串”
好吧,这很奇怪..让我们搜索stackoverflow。瞧,我发现了一个片段,它暗示了这一点:
var items = from str in doc.Root.Descendants("data")
select new ResourceValue
{
Name = str.Attribute("name").Value,
Value = str.Element("value").Value,
Comment=(string)str.Element("comment")
};
哇。这样可行!?但是,转换null
为字符串会引发空引用异常......不是吗?我以为as string
正是这种情况!?
这是如何工作的,为什么我可以进行显式转换,但不能进行显式as
转换?