Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我可以使用(字符串),但不能使用“字符串”;“作为字符串”;在Linq到XML查询中?_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

C# 为什么我可以使用(字符串),但不能使用“字符串”;“作为字符串”;在Linq到XML查询中?

C# 为什么我可以使用(字符串),但不能使用“字符串”;“作为字符串”;在Linq到XML查询中?,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,因此,我第一次深入研究LINQtoXML(我知道,我落后于时代),到目前为止,它非常酷。然而,我遇到了这种令人困惑的行为 我正在解析通用的.resx格式。在其中,您有数据标记,这些标记具有值和可选的注释。以下是我最初尝试的代码: var items = from str in doc.Root.Descendants("data") select new ResourceValue { Name =

因此,我第一次深入研究LINQtoXML(我知道,我落后于时代),到目前为止,它非常酷。然而,我遇到了这种令人困惑的行为

我正在解析通用的
.resx
格式。在其中,您有
数据
标记,这些标记具有
和可选的
注释
。以下是我最初尝试的代码:

        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
            };
当然,当我得到
comment
元素的
.value
时,它抛出了一个空引用异常。。好吧,让我们再试一次。我听说你可以把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”转换为“string” 引用转换、装箱转换、取消装箱转换、换行 转换,或空类型转换

嗯,这很奇怪。。让我们搜索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
强制转换为字符串会引发null引用异常。。。不是吗?我认为
作为字符串
正是适合这种情况

这是如何工作的,为什么我可以进行显式转换,而不是显式的
as
cast

str.Element("comment") as string
这将检查
XElement
是否为字符串。但这不是真的-
XElement
不是从字符串派生的,所以它不是字符串。这就是为什么你有错误

(string)str.Element("comment")
这是一个重载运算符,它从内部获取
属性:

public static explicit operator string(XElement element)
{
    if (element == null)        
        return null;

    return element.Value;
}
它首先检查操作数是否为
null
,如果是,则只返回
null
。这就是为什么你没有例外



顺便说一句这些显式强制转换操作符有一件有趣的事情-它们都不会抛出
NullReferenceException
,因为它们在访问元素的Value属性之前检查元素是否为null。即使元素为
null
并且您试图获取整数,您也将拥有
ArgumentNullException
而不是
NullReferenceException
。如果
null
是您要强制转换到的类型(即可为null的类型或字符串)的可接受值,则返回
null
,没有任何异常。这就是为什么使用这些显式强制转换运算符比访问值属性安全得多。

obj as string-这是一种将对象转换为字符串的尝试,可能会失败,也可能不会失败(如果失败,结果为null),不会引发异常。 (string)obj-这是obj对string类型的显式转换,您告诉编译器obj是一个字符串。如果obj不是字符串类型,您将得到一个强制转换异常

请参阅此链接以了解更多信息-

所以它不是隐式调用
ToString()
方法吗?@the解决方案否,如果元素不为null,它只获取值