c# - 是否有一种紧凑的方式告诉 C# 编译器使用基本的 Equals 和 == 运算符?

标签 c# c#-4.0 struct overriding equals

我是 C# 的新手,我有 C++ 背景。

我已经定义了一个结构,但 (Microsoft) 编译器不断弹出错误 CA1815“'GenericSendRequest' 应该覆盖 Equals”

我仔细阅读了一下,发现 C# 结构派生自 ValueType,它使用反射实现了一个通用的 Equals。这让我更加困惑:

  1. 如果只是性能问题,为什么编译器会生成错误而不是警告?
  2. 如果它不允许您使用它,为什么首先要定义泛型 Equals?

那么我怎样才能告诉编译器“我不在乎”呢?类似于仅在 C++ 类中声明赋值运算符而不提供定义以确认我知道我在做什么。

到目前为止,我的解决方案包括:

    public static bool operator ==(GenericSendRequest lhs, GenericSendRequest rhs)
    {
        return lhs.Equals(rhs);
    }

    public static bool operator !=(GenericSendRequest lhs, GenericSendRequest rhs)
    {
        return !lhs.Equals(rhs);
    }

    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    //Yes, it also makes me override GetHashCode since I'm overriding Equals.
    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

在我的结构中,这太糟糕了。

编辑: 这是结构定义:

public struct GenericSendRequest
{
        public LiveUser             Sender;
        public LiveUser[]           Receivers;
        public Message              Msg;
        public ServiceHttpRequest   HttpRequest;
}

它的用法只是一个函数的多个返回值:

public static GenericSendRequest CreateGenericSendRequest(...);

最佳答案

这绝对不是错误,它只是一个警告 - 如果您在构建过程中启用了代码分析,则该警告甚至只会出现。这是性能优化的建议 - 采纳它。

编辑:

原来这是可配置的:

转到项目属性 |代码分析 | 运行这个规则集.. 打开

展开 Performance 部分 - 对于 CA 1815,您可以选择是否希望这是警告、错误或无。

enter image description here

关于c# - 是否有一种紧凑的方式告诉 C# 编译器使用基本的 Equals 和 == 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563519/

相关文章:

c# - 如何向 ILIST 添加指定数量的列表元素?

visual-studio-2010 - 如何禁用自定义任务 Pane 的调整大小和关闭按钮?

c - 返回寄存器中的结构 - GCC 中的 ARM ABI

c# - 从 SQL Server (CE) 中的数字中获取正确 n 位的最佳方法

c# - 如何计算面板的哪个项目被选中

c# - 应用程序更新时的 UWP BackgroundTask

function - 为什么不能用 VAR 返回类型声明函数?

asp.net - 在 ASP.NET MVC 中构建自定义授权

c - C 中的结构内部列表 - 显示链接列表中存在的结构的成员

swift - swift 中的变异结构函数是否会创建一个新的 self 副本?