如何确定两个泛型类型值是否相等?

2024-04-19

Update*我很抱歉...我的示例代码包含一个错误,导致很多我不理解的答案。 代替

Console.WriteLine("3. this.Equals   " + (go1.Equals(go2)));

我本来想写

Console.WriteLine("3. this.Equals   " + (go1.Equals(sb2)));

我试图弄清楚如何成功确定两个泛型类型值是否彼此相等。基于马克·拜尔斯的回答这个问题 https://stackoverflow.com/questions/3470145/two-net-objects-that-are-equal-dont-say-they-are我想我可以使用value.Equals()其中 value 是泛型类型。 我的实际问题是在链接列表实现中,但问题可以通过这个简单的示例来显示。

class GenericOjbect<T> {
    public T Value { get; private set; }
    public GenericOjbect(T value) {
        Value = value;
    }
    public bool Equals(T value) {
        return (Value.Equals(value));
    }
}

现在我定义一个实例GenericObject<StringBuilder>含有new StringBuilder("StackOverflow")。我希望得到true如果我打电话Equals(new StringBuilder("StackOverflow")在此 GenericObject 实例上,但我得到false.

一个示例程序显示了这一点:

using System;
using System.Text;

class Program
{
    static void Main()
    {
        var sb1 = new StringBuilder("StackOverflow");
        var sb2 = new StringBuilder("StackOverflow");

        Console.WriteLine("StringBuilder compare");
        Console.WriteLine("1. ==            " + (sb1 == sb2));
        Console.WriteLine("2. Object.Equals " + (Object.Equals(sb1, sb2)));
        Console.WriteLine("3. this.Equals   " + (sb1.Equals(sb2)));

        var go1 = new GenericOjbect<StringBuilder>(sb1);
        var go2 = new GenericOjbect<StringBuilder>(sb2);

        Console.WriteLine("\nGenericObject compare");
        Console.WriteLine("1. ==            " + (go1 == go2));
        Console.WriteLine("2. Object.Equals " + (Object.Equals(go1, sb2)));
        Console.WriteLine("3. this.Equals   " + (go1.Equals(sb2)));
        Console.WriteLine("4. Value.Equals  " + (go1.Value.Equals(sb2.Value)));
    }
}

对于比较两个 StringBuilder 对象的三种方法,只有 StringBuilder.Equals 实例方法(第三行)返回true。这正是我所期望的。但是当比较 GenericObject 对象时,它的 Equals() 方法(第三行)返回false。有趣的是,第四种比较方法does return true。我认为第三个和第四个比较实际上在做同样的事情。

我本以为true。因为在GenericObject类的Equals()方法中,两者value and Value属于类型T在本例中是一个StringBuilder。基于马克·拜尔斯 (Mark Byers) 的回答这个问题 https://stackoverflow.com/questions/3470145/two-net-objects-that-are-equal-dont-say-they-are,我本来期望Value.Equals()方法使用 StringBuilder 的 Equals() 方法。正如我所展示的,StringBuilder 的 Equal() 方法确实返回true.

我什至尝试过

public bool Equals(T value) {
    return EqualityComparer<T>.Default.Equals(Value, value);
}

但这也会返回 false。

所以,这里有两个问题:

  1. 为什么代码不返回true?
  2. 我怎样才能实施Equals方法所以它does return true?

正如建议的马克·格拉维尔的回答 https://stackoverflow.com/questions/4639443/how-to-determine-if-two-generic-type-values-are-equal/4639504#4639504,问题在于StringBuilder Equals(object)与中的实施方式不同Equals(StringBuilder).

然后,您可以忽略该问题,因为您的代码将与任何其他一致实现的类一起使用,或者您可以使用动态来解决问题(再次按照 Mark Gravell 的建议)。

但是,鉴于您没有使用 C# 4(因此没有动态),您可以尝试以下方式:

public bool Equals(T value)
{
   // uses Reflection to check if a Type-specific `Equals` exists...
   var specificEquals = typeof(T).GetMethod("Equals", new Type[] { typeof(T) });
   if (specificEquals != null &&
       specificEquals.ReturnType == typeof(bool))
   {
       return (bool)specificEquals.Invoke(this.Value, new object[]{value});
   }
   return this.Value.Equals(value);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确定两个泛型类型值是否相等? 的相关文章

  • C++ 析构函数和函数调用顺序

    假设我有以下代码片段 Foo foo return bar 现在 C 标准是否保证 bar 将在 foo Foo 之前调用 或者这是编译器 实现的选择 Thanks 这是有保证的行为 实际执行过程如下 0 enter block scope
  • 获取 WSA 错误代码的格式化消息

    我在 win32 C 应用程序中使用winsock2 我将使用 MessageBox 显示可以通过调用 WSAGetLastError 检索的网络错误 我怎样才能做到这一点 我看到 FormatMessage 但我不明白如何使用它 例如 以
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • DataGridView 自动完成组合框列不保留初始单元格离开时的值

    我有一个带有自动完成组合框列的绑定 dataGridView 并且自动完成功能正在工作 只是我观察到一种有点令人恼火的行为 当我第一次在自动完成单元格中键入文本并使用 tabKey 移动到下一个单元格时 我的选择不会保留 我选择的内容将被清
  • 将 MyGeneration 与 Fluent NHibernate 结合使用

    我在这里找到了一个使用 MyGeneration 生成 NHibernate 代码的绝佳模板 http vucetica blogspot com 2009 01 nhibernate template for my Generation
  • EWS 消息跟踪报告

    我一直在研究如何使用 EWS 从交换中获取消息跟踪报告 但似乎无法查明任何内容 我打算构建一个抓取日志文件的应用程序 但如果我可以通过 EWS 来完成它 那对我正在做的事情会更好 有任何想法吗 我终于能够为我的问题创建一个解决方案 我在 C
  • 在 WinForms 中显示输入对话框

    我想在我的 WinForm 应用程序中显示输入模式 我浏览过网络 但没有找到执行此操作的良好模式 我知道我必须创建另一个表单 并使用 ShowDialog 方法 你是对的 请注意 模式对话框在关闭时不会自动处理 与非模式对话框不同 因此您需
  • std::atomic 是否会阻止非原子变量对原子变量进行重新排序

    问题很简单 问 如果我有 settings N STNGS used by many threads std atomic
  • 如何对具有无效值的属性使用 JSON.net 的默认值

    我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应 问题是某些字段包含无效值 例如 一条记录上的一个字段包含一个 T 表示该字段应该是数字 我想做的是将无效字段的值设置为 null 或其他默认值 我的所有属性都
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 拦截C# HttpClient GetAsync

    我有一个 Web 项目 C MVC5 但没有 WebAPI 和一个简单的 HTTP REST 客户端 该客户端调用外部 REST 服务并获取 accessToken 等 我想检查所有 Get PostAsync 调用对 statusCode
  • 使用 Entity Framework Core 在运行时迁移

    我正在将 PHP Illuminate 应用程序移植到 ASP NET Core EF Core 其中一部分由类似 Wordpress 的安装过程组成 该过程要求提供数据库凭据 然后创建应用程序运行所需的表 本质上 我想在运行时运行某种迁移
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • 初学者友好的方法来获取所有文件和目录的列表

    使用 NET 3 0 我得到了下面的方法 它可以正确返回指定目录的所有文件和目录 以及子目录 的集合 如果可能的话 我想将其简化为仅使用我非常熟悉的结构 具体来说 有以下几点我不太清楚 1 IEnumerable
  • 使用全局 Web API 过滤器属性进行 Unity 依赖注入

    参考这个CodePlex 统一文章 http unity codeplex com discussions 446780我能够使用 WebAPI 控制器获取过滤器属性 如下所示 MyFilterAttribute public class
  • 使用C#在SQL Server上执行sql文件

    我有很多程序 视图 函数等文件 我想在 SQL Server 2005 2008 上的适当数据库中执行这些文件 创建组件 还有一点是我想使用 C 来执行它们 另一点需要提及的是 我希望应用程序也可以在远程 SQL Server 上执行此文件
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • C# - 平移光标

    我正在 PictureBox 控件中实现大图像的平移 并且设置适当的方向平移光标没有问题 但是 我似乎找不到用于平底锅原点的图像 内部带有箭头的圆圈 我在哪里可以找到它 我觉得image您正在寻找的内容未包含在框架中 每个应用程序都使用自己
  • 虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C#

    我正在尝试使用 c 在 Windows 窗体中创建一个类似 swype 的键盘 我有两个问题 A 我无法重现手指滑动动作 b 我无法识别不同按键下的字母 对于第一个问题 我使用了 Graphics 类和 Pen 类 并像这样使用它 bool
  • 有C语言的解释器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话

随机推荐

  • Symfony2 Doctrine2 内存泄漏/超出内存限制

    我在symfony2和doctrine2的结合上遇到了很多麻烦 我必须处理巨大的数据集 大约 2 3 百万次写入和读取 并且必须做大量额外的工作以避免内存不足 我找出了两个要点 即 泄漏 内存 它们实际上并不是真正泄漏 而是分配了很多内存
  • 优化缓慢的 ORDER BY RAND() 查询

    我有一个正在使用的查询ORDER BY RAND 但这需要太长时间 而且随着数据的增长 情况会变得更糟 该查询连接两个表 返回 5 个随机产品以及每个产品的随机图像 表 1 产品 product id pk auto inc name de
  • 下载文件 java spring Rest api

    我想制作一个rest api控制器 spring boot 当用get请求时将允许我下载一个excel文件 目前我有这个端点 RequestMapping value download xls method RequestMethod GE
  • 如何在 Bash 中保留带引号的字符串中的换行符? [复制]

    这个问题在这里已经有答案了 我正在创建一个脚本来自动创建 apache 虚拟主机 我的脚本的一部分是这样的 MYSTRING
  • 在Android中使用AudioTrack播放WAV文件

    我正在使用 Android 试图让我的 AudioTrack 应用程序播放 Windows wav 文件 Tada wav 坦率地说 这不应该这么难 但我听到了很多奇怪的事情 该文件保存在我手机的迷你 SD 卡上 读取内容似乎不是问题 但是
  • Eclipselink 生成的规范元模型不会从另一个 jar 扩展基本元模型

    我使用 Netbeans 8 0 1 创建了两个 Maven 项目来说明问题 common1 和 common2 jar common1 封装包1 MappedSuperclass public class Entity1 implemen
  • 符号被认为是标识符,而不是运算符

    我想实现一个在我的软件中使用的货币运算符 它接受 Double 并返回货币类型以进行更精确的计算 自定义运算符的代码基本上看起来有点像这样 请忽略这种形式中明显的精度下降以及因此无用的运算符 postfix operator postfix
  • 为 Phusion Passenger 应用程序设置环境变量

    我已经在开发中设置了 Passenger Mac OS X 并且它运行完美 后来唯一的问题来了 现在我有一个自定义的GEM HOME路径和 ImageMagick 二进制文件安装在 usr local 我可以将它们放入获取源的 shell
  • regexp_split_to_table 和 row_number

    我有一个包含字符串数据的表 如下所示 id string data 1 red green blue 2 orange 3 purple cyan 我需要将字符串数据拆分为具有行号的项目 id num item 1 1 red 1 2 gr
  • Chrome 在调整大小时无法正确更新背景大小渐变

    虽然 Firefox 正确地做到了这一点 但更新了linear gradient每一帧上的背景 chrome 似乎都会以 跳跃 的方式渲染事物 这意味着它只会在调整大小后每隔几个像素渲染一次数学上正确的布局 演示游乐场 http jsbin
  • 如何使用 Haskell 创建符号链接?

    如何使用 Haskell 创建符号链接 这directory据我所知 包没有提供一种方法来做到这一点 Creating a symbolic link is non portable For example the creation sym
  • 当记录处理时间超过“max.poll.interval.ms”时,在消费过程中记录/消息会发生什么?

    我的消费者设置如下 auto offset reset earliest enable auto commit true default value session timeout ms 10000 default value max po
  • 如何让 nginx 和乘客在部署后自动重启

    我目前在虚拟专用服务器上部署了一个 Rails 应用程序 我使用 Capistrano Nginx 和乘客在服务器上运行我的 Rails 应用程序 由于某种原因 在完成 cap 部署 更新后 我永远无法在网站上显示更新的代码 部署进行得很好
  • 使用 Zeep 解析 WSDL

    我想用 Zeep 解析 WSDL 文件并退出 所有操作 为每个操作请求 xml 消息 有解析 wsdl 的例子吗 我想我应该使用 zeep wsdl 和 parse service 方法 A updated import operator
  • JPA Criteria API:用于可选关系的 LEFT JOIN

    我基本上是第一次使用 Criteria API 这是关于抽象通用构建器的查询 public TypedQuery
  • 如何在 Akka.NET 中使用 TestKit

    我正在尝试测试我的 Akka NET Actor 但在使用 TestKit 和理解它的工作原理时遇到了一些问题 由于 Akka NET 中还没有关于单元测试的官方文档 我已经探索了 Akka NET 存储库中的示例代码 但那里使用的示例对我
  • Logstash 错误 Java::JavaLang::NoClassDefFoundError 无法解决

    我是elasticsearch ES 和logstash 的新手 我已经使用它成功设置了elasticsearch和kibanalink https www youtube com watch v hVgrXi 9L6Y 之后我尝试使用lo
  • 如何在谷歌自定义菜单中制作图标[重复]

    这个问题在这里已经有答案了 在 Google 应用程序中 文档 表格等 是否可以使自定义菜单中的图标与插入菜单中的图标相似 如果是这样我该怎么办 html 服务 图表 链接 图像旁边 甚至粗体 斜体等旁边的内容 Thanks 没有公开的方法
  • 如何将秒转换为 hhmmss

    我到处寻找将秒转换为 hh mm ss 但找不到合适的 我创建了一个程序 允许用户输入两个不同的时间 然后计算差异 输入的时间以 hh 3600 mm 60 ss 分割 然后转换为秒并相互减去以计算秒差 例如 12 12 12 和 13 1
  • 如何确定两个泛型类型值是否相等?

    Update 我很抱歉 我的示例代码包含一个错误 导致很多我不理解的答案 代替 Console WriteLine 3 this Equals go1 Equals go2 我本来想写 Console WriteLine 3 this Eq