C#: Inherit from Boolean?

2020-04-10 02:20发布

问题:

(how) can I Inherit from Boolean? (Or make my class comparable to Boolean with '=' Operator)

class MyClass : Boolean
{
    public MyClass()
    {
        this = true;
    }
}
class Program
{
    public Program()
    {
        MyClass myClass = new MyClass();
        if(myClass == true)
            //do something...
        else
            //do something else...
    }
}

回答1:

Simple example:

public class MyClass {
    private bool isTrue = true;

    public static bool operator ==(MyClass a, bool b)
    {
        if (a == null)
        {
            return false;
        }

        return a.isTrue == b;
    }

    public static bool operator !=(MyClass a, bool b)
    {
        return !(a == b);
    }
}

somewhere in code you can compare your object with boolean value:

MyClass a = new MyClass();
if ( a == true ) { // it compares with a.isTrue property as defined in == operator overloading method
   // ...
}


回答2:

You can't. System.Boolean is a struct, and you can't derive from structs.

Now, why do you want to do so, exactly? What's the bigger purpose?

You could include an implicit conversion operator from your class to bool, but personally I wouldn't. I would almost always prefer to expose a property, so you'd write:

if (myValue.MyProperty)

... I think that keeps things clear. But if you could give us more of the real context, we may be able to give more concrete advice.



回答3:

You can use an implicit conversion operator to have this code:

class MyClass {
  public bool Value { get; set; }
  public MyClass() {
    Value = true;
  }
  public static implicit operator bool(MyClass m) {
    return m != null && m.Value;
  }
}

class Program {
  public static void Main() {
    var myClass = new MyClass();
    if (myClass) { // MyClass can be treated like a Boolean
      Console.WriteLine("myClass is true");
    }
    else {
      Console.WriteLine("myClass is false");
    }
  }
}

It can be used as above:

if (myClass) ...

Or like this:

if (myClass == true) ...


回答4:

while your example wouldnt work, you can do something similar for your own classes to test if one equals the values of another.

http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

public static bool operator ==(ThreeDPoint a, ThreeDPoint b)
{
    // If both are null, or both are same instance, return true.
    if (System.Object.ReferenceEquals(a, b))
    {
        return true;
    }

    // If one is null, but not both, return false.
    if (((object)a == null) || ((object)b == null))
    {
        return false;
    }

    // Return true if the fields match:
    return a.x == b.x && a.y == b.y && a.z == b.z;
}

public static bool operator !=(ThreeDPoint a, ThreeDPoint b)
{
    return !(a == b);
}


回答5:

You can ("or make my class comparable..."), by overriding the == operator. I presume Jon Skeet overlooked that part of the question.



回答6:

If you want to be able to use your value in 'if' statements, define operator true and operator false (along with the & and | operators if you want to use && and ||.) (VB equivalents)

To answer more, I would have to know what you're trying to do (in other words, why not just use bool directly?)