这是我正在努力解决的简化案例:
public bool CompareStruct<S>(S a, S b) where S : struct
{
return a == b;
}
Run Code Online (Sandbox Code Playgroud)
以上不会编译错误Operator '==' cannot be applied to operands of type 'S' and 'S'。
通常情况下,我不会感到惊讶。但我已经指出那S是一个结构体——那么为什么我不能比较这两个参数呢?
我不认为这个 SO 问题在这里有任何相关性 - 毕竟,我正在使用struct类型,而不是引用类型。
这里的问题是==C#中的默认行为是引用相等。结构中的引用相等没有意义,因为它总是会返回false。
编译器无法知道是否==已重载并S具有值相等语义,因此不允许使用它。
要解决此问题,请使用Equals并考虑限制S为IEquatable<S>if 适当以避免不必要的装箱操作。