在相等运算符实现中引用相等运算符

2024-03-14

使用 Reflector 或 DotPeek,相等运算符重载的 System.Linq.Data.Binary 实现如下所示:

[Serializable, DataContract]
public sealed class Binary : IEquatable<Binary>
{
...
    public static bool operator ==(Binary binary1, Binary binary2)
    {
        return ((binary1 == binary2) || (((binary1 == null) && (binary2 == null)) || (((binary1 != null) && (binary2 != null)) && binary1.EqualsTo(binary2))));
    }

我一定错过了一些明显的东西,或者存在一种我不知道的机制(例如在体内隐式调用 object == ?)。我承认,我很少需要重载标准运算符。

为什么这个实现不会导致无限递归(一个简单的测试表明它不会无限递归)?第一个条件表达式是binary1==binary2,在运算符重载的实现中,如果您在实现之外使用binary1==binary2,就会调用该运算符重载,而且我也想在实现内部使用。


我预计这是你的反编译器中的一个错误。 Redgate Reflector 有同样的错误,我已经在 ILSpy 中找到它 https://github.com/icsharpcode/ILSpy/issues/217 too.

之所以很难反编译,是因为它巧妙地测试了 C# 的重载规则。原始代码很可能是这样的(object)obj1==(object)obj2,但这种转换在 IL 本身中是看不到的。就运行时而言,将任何引用类型强制转换为基类型都是无操作的。然而,它确实让 C# 选择引用相等操作码,而不是调用重载的相等运算符。

IMO 在反编译器中实现这一点的正确方法是始终将引用相等性检查反编译为(object)obj1==(object)obj2然后优化冗余转换(如果它们不影响重载解析)。这种方法也将解决方法重载的类似问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在相等运算符实现中引用相等运算符 的相关文章

随机推荐

  • 将 Selenium WebDriver 与 Tor 结合使用

    因为 Tor Browser Bundle 只是 Firefox 的补丁版本 所以似乎应该可以使用FirefoxDriver使用 Tor 浏览器 这是我到目前为止所尝试过的 String torPath C Users My User De
  • 类路径中的 Groovy 资源未加载

    今天是个好日子 我正在使用 spock 框架在我的 groovy 项目 IDE Intellij Idea 12 6 中进行测试 我的 spock 规范类将文件名传递给 groovy 对象进行处理 该文件肯定位于类路径中 但是当我尝试以这种
  • 如何用Java编写全屏模式?

    我希望我的应用程序具有全屏模式 最简单的方法是什么 我是否需要第三方库来实现此目的 或者 JDK 中是否已经提供了此功能 Try the 全屏独占模式API http java sun com docs books tutorial ext
  • 即使我在组件中添加了提供程序,角度 2 中也没有响应提供程序?

    错误 这是我收到的错误 即使我已将提供程序添加到我的组件中 我无法获取我的错误是什么 这是我的所有文件 应用程序组件 ts 应用程序组件 html carservice ts 我无法解决 EXCEPTION Error in 0 0 ORI
  • 在批次之间传递 LSTM 状态的最佳方式

    我正在尝试找到在批次之间传递 LSTM 状态的最佳方法 我已经搜索了所有内容 但找不到当前实施的解决方案 想象一下我有类似的东西 cells rnn LSTMCell size for size in 256 256 cells rnn M
  • 在 Linux C 控制台应用程序中模拟按键

    有没有办法用C语言在Linux中模拟按键 在我的具体情况下 我使用的是 Ubuntu 9 04 需要一个简单的应用程序 在启动时调用 暂停 按钮 这将使 Firefox 中的 iframe 使用 Javascript 进行刷新 我假设你的意
  • 使用 Python-oauth2 在 python 中为 tumblr API 初始化 Oauth 客户端

    我是 Oauth 的新手 过去 对于用 Python 编写的 Twitter 应用程序 我使用 python oauth2 库来初始化客户端 如下所示 consumer oauth Consumer key CONSUMER KEY sec
  • 如何在 React 中拖放多个元素?

    这是我在 StackOverflow 上的第一个问题 我想用 React 构建一个小游戏 用户可以将四块骨牌拖放到网格上 也可以根据自己的喜好重新定位或旋转它们 四格骨牌由矩阵表示 然后每个块都在 li 元素中渲染 z tetromino
  • 从 html select 中选择的总和

    尝试了多种方法 进行了大量研究 也许我错过了一些东西但无法完成 所以 我想知道是否可以对 html select 的选定值求和 这是我的代码
  • 使用express在node.js中进行本地化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪个包在 Node js 中使用 Express 进行本地化 Thanks 节点本地化 http
  • 为什么仅在 CNN 中对通道进行批量归一化

    我想知道 在卷积神经网络中 批量归一化是否应该分别应用于每个像素 或者我应该取每个通道的像素平均值 我在Tensorflow的描述中看到了这一点tf layers batch normalization https www tensorfl
  • Visual Studio 2017 HRESULT:0x80004004

    我在 Docker 容器中完美地运行了 ASP NET Core 项目 但随后我在同一解决方案中创建了另一个项目 该项目被第一个项目引用 构建时 VS 2017 没有抱怨 调试时VS说 操作已中止 HRESULT 异常 0x80004004
  • rtl HTML 页面中的方向 ltr

    我试图在 rtl HTML 页面中显示负数 该标签似乎没有回应我的direction ltr 我写了一个jsFiddle http jsfiddle net opmaster rWSXX 1 显示相反的场景 尝试从右到左显示 Add uni
  • SwiftUI:什么是 @AppStorage 属性包装器

    我曾经使用以下语句将重要的应用程序数据 例如登录凭据 保存到 UserDefaults 中 UserDefaults standard set email protected cdn cgi l email protection forKe
  • 这种未记录的 RAISERROR 语法是否曾经被记录并随后被弃用?

    我正在开发一个大型 SQL Server 代码库 其中一些代码库至少从 SQL 7 甚至更早的版本就开始开发了 在整个代码库中 引发错误的方法是使用以下语法 据我所知 该语法未记录 RAISERROR
  • 如何优化(最小化)jQuery AJAX 调用

    我的代码的不同函数有超过 50 个 AJAX 调用 所有这些调用都具有相似的结构 但具有不同的数据 url 回调参数 var jqXHR post dba port php mode del wallfunds pdata cdata wn
  • 构建图像时出错:在存储库 docker.io/hyperledger/fabric-baseimage 中找不到最新标签

    我将链代码部署到对等网络 但没有成功 我查看了同行的日志 看到了一条错误消息 构建镜像时出错 在存储库 docker io hyperledger fabric baseimage 中找不到最新标签 从中提取特定的基础镜像https hub
  • 如何更改 Django 表行的颜色?

    是否可以根据当前对象的值更改行的颜色 就我而言 我有一个table从模型创建Job The Job有属性delivery If job delivery例如 已交付 我想将行的颜色更改为红色 我唯一想到的是使用JQuery但我不确定这是否有
  • 使用 JS SDK 以您自己的身份(而不是页面)在页面上发表评论 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 在相等运算符实现中引用相等运算符

    使用 Reflector 或 DotPeek 相等运算符重载的 System Linq Data Binary 实现如下所示 Serializable DataContract public sealed class Binary IEqu