覆盖类上的==和!=

Cha*_*ana 2 c# operator-overloading

是否有任何方法可以在类上执行此操作并仍保留检测Type的变量是否为空的功能?我可以为结构执行此操作,(因为struct不能真正为null,使用结构,而不是将x与null进行比较,您使用单独的方法caleld IsNull或HasValue ...但是您不能将该技术用于类的原因是当类变量为null时,你当然不能调用这样的实例方法了!

public class myClass: IEquatable<myClass>
{
    public int IntValue { get; set; }
    public static bool operator ==(myClass cA, myClass  cB)
    { return cA is myClass && cB is myClass && cB.Equals(cA); }
    public static bool operator !=(myClass cA, myClass cB)
    { return !(cA == cB); }       
    public override bool Equals(object o) 
    { return o is myClass && this == (myClass)o; }
    public override bool Equals(myClass o) 
    { return IntValue == o.IntValue; }

} 
Run Code Online (Sandbox Code Playgroud)

但是当我走的时候:

myClass x;
if (x != null)    // this returns false when it should be true 
{
   //code to execute with x here
}
Run Code Online (Sandbox Code Playgroud)

对于它的价值,我希望它成为一个类的唯一原因是因为它参与了一个简单的继承关系.这是一个不可改变的类,并且实际上我想在这里做的是代码,以便它可以表现得像一个不可改变的,可空类,酷似一个不可改变的,可空结构的行为(如Nullable<int>Nullable<float>等.

Coi*_*oin 5

这就是为什么IsNull应该是一个参数的静态方法.string.IsNullOrEmpty是一个很好的例子.在那之后,没有什么可以阻止你使它成为一个扩展方法.

public class MyClass
{
    public static bool IsNull(MyClass other)
    { return ReferenceEquals(other, null); }
    public static bool HasValue(MyClass other)
    { return !IsNull(other); }
    // other code
}

public static class MyClassExtension
{
   public static bool IsNull(this MyClass myClass)
   {
       return MyClass.IsNull(myClass);
   }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您在不抛出的情况下执行以下操作:

MyClass myClass = null;
if(myClass.IsNull())
{
   //...
}
Run Code Online (Sandbox Code Playgroud)