Linq to xml API中 XName 的奇怪实现

简介:

最近,在使用LinqToXml的时候,使用到其中一个重要的类:XName。它表示一个XML元素/XML属性的“名字”。    System.Xml.Linq中的API,大量使用了这个类,如:

image

    不过还好,我们不用每次都显式的new一个XName类的实例,因为它实现了从string类到它的隐式转换:

public static implicit operator XName(string expandedName);
    这样使得我们在使用的过程中,可以很简单的直接使用linqtoxml的API。如:
XElement person = new XElement("Person");
person.Attribute("Name").Value = "Name";

    同时,由于它也和string类一样,使用了隐式的操作符== 和 !=,所以我们在对它的实例进行判定时,可以使用以下方法:

XName name1 = "name";
XName name2 = "name";
if (name1 == name2)
{
    //do something
}
    当我使用Reflector查看到这个操作符的实现时,它居然是下面这样的!?
image 

    也就是说,它的所有判断相等性,都是使用==操作符,但是这个操作符的实现居然是调用它自己。

    我想,可能是reflector生成的C#有问题,不过查看IL后,也是一样的结果。所以我就写了一个类进行验证:

public class Name
{
    public static bool operator ==(Name left, Name right)
    {
        return (left == right);
    }
    public static bool operator !=(Name left, Name right)
    {
        return !(left == right);
    }

    public static void Test()
    {
        Name name1 = new Name();
        Name name2 = new Name();
        if (name1 == name2)
        {
            //do nothing
        }
    }
}

    结果是:

image

    果然是不能这样写,但是XName为什么可以呢?

目录
相关文章
【leedcode】0003. 无重复字符最长子串
【leedcode】0003. 无重复字符最长子串
145 0
|
Java 数据库连接
JDBC跨平台封装工具类
JDBC跨平台封装工具类
106 0
|
C语言
【C语言走进现实】猜凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
|
移动开发 HTML5 容器
分享html5的一个拖拽手法
  就是这样的效果:拖拽之前        之后:          上代码: html5 drag and drop *[draggable=true] { -moz-us...
5540 0
|
存储 安全 数据安全/隐私保护
一个偏执狂黑客的密码保护之道
本文讲的是一个偏执狂黑客的密码保护之道,前几天(5月4日)是一年一度的世界密码日,主要提醒用户注意保护账号。作为舶来纪念日,世界密码日前两年国内还有些声音,今年几乎看不到了,有点可惜。
1463 0
kde
|
14天前
|
JSON Linux 数据格式
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
9181 70
|
12天前
typora免费版,激活方法,Typora使用教程
Typora是一款简洁高效的Markdown编辑器,支持即时渲染。本教程涵盖安装方法、文件操作、视图控制、格式排版、字体样式及Markdown语法,助你快速上手使用Typora进行高效写作。
2382 6
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等