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

Ram*_* B. 9 c# struct overriding equals c#-4.0

我是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();
    }
Run Code Online (Sandbox Code Playgroud)

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

编辑: 这是结构定义:

public struct GenericSendRequest
{
        public LiveUser             Sender;
        public LiveUser[]           Receivers;
        public Message              Msg;
        public ServiceHttpRequest   HttpRequest;
}
Run Code Online (Sandbox Code Playgroud)

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

public static GenericSendRequest CreateGenericSendRequest(...);
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 9

这绝对不是一个错误,它只是一个警告 - 如果你已经启用了代码分析作为构建的一部分,那么警告甚至只会出现.这是性能优化的建议 - 采取这种方式.

编辑:

事实证明这是可配置的:

Project Properties | Code Analysis | Run this rule set.. Open

展开Performance部分 - 对于CA 1815,您可以选择是将其设置为警告,还是错误或无.

在此输入图像描述