C#,多个==运算符重载,没有模糊的空值检查

Chi*_*nim 18 c# operator-overloading null-check

简介:
我有一些类可以完成相同的工作,但具有不同的值类型(例如浮点数或整数的向量).
现在我希望能够检查相等性,这种相等性也应该在类型之间起作用(例如vectorF == vectorI).
此外,应该可以进行空检查(vectorF == null).

方法:
我的方法是为==和!=运算符创建多个重载,每个可能的组合一个.

public sealed class VectorF
{
    [...]

    public static bool operator == (VectorF left, VectorI right)
    {
        // Implementation...
    }

    public static bool operator == (VectorF left, VectorF right)
    {
        // Implementation...
    }

    // Same for != operator
    [...]
}
Run Code Online (Sandbox Code Playgroud)

问题:
使用多个重载,我不能只使用==运算符进行空检查,因为调用将是不明确的.

var v = new VectorF([...]);

if (v == null)    // This call is ambiguous
[...]
Run Code Online (Sandbox Code Playgroud)

我知道有可能使用ReferenceEquals或null cast,但这种方法对我来说是一个严重的限制.

var v = new VectorF([...]);

if(object.ReferenceEquals(v, null))    // Would work, is not user friendly.
[...]

if(v == (VectorF)null)    // Would also work, is neither user friendly.
[...]
Run Code Online (Sandbox Code Playgroud)

问题:
有没有办法以某种方式实现==运算符,它允许简单的空检查,并允许在不同的向量之间进行相等性检查?

或者,我是否可以/应该如何实现这一点?

InB*_*een 20

我会从一开始就推迟整个设计.我永远不会==在不同类型之间实现值语义,我会发现它相当混乱:instaceTypedA == instanceTypedB大喊引用相等(至少对我而言).

如果您需要这个,那么在VectorI和之间实现隐式转换VectorF.这就是框架的工作原理.执行以下操作时:

int i = 1;
double d = 1;
var b = i == d;
Run Code Online (Sandbox Code Playgroud)

==(int, double)不会神奇地产生过度负荷.发生的事情是i隐式转换为double并被==(double, double)调用.


Pat*_*man 8

您可以使用is以下方法来转换比较:

if (v is VectorF)
Run Code Online (Sandbox Code Playgroud)

如果v是,则此检查将失败null.

  • 我不太喜欢这个解决方案.你真正做的事情的语义隐藏在一个"聪明"的技巧中; 老实说,阅读这段代码,你很难清楚你要检查"null". (5认同)