是的,您可以这样做。如果您想要一个行为类似于内置类型的自定义类型,则必须注意覆盖从System.Object 继承的一些方法。此外,您还需要转换运算符。
让我们创建一个名为Logical 的结构体,它有一个int 属性Value。
public readonly struct Logical : IEquatable<Logical>
{
public Logical(int value)
{
Value = value == 0 ? 0 : 1;
}
public Logical(bool cond)
{
Value = cond ? 1 : 0;
}
public int Value { get; }
... conversions and overrides
}
它有 2 个构造函数,允许您从 int 或 bool 构建一个值。
我们可以声明隐式转换以在bool 和Logical、int 和Logical 和Logical 和bool 之间进行转换。
public static implicit operator Logical(bool cond) => new Logical(cond);
public static implicit operator Logical(int i) => new Logical(i);
public static implicit operator bool(Logical logical) => logical.Value != 0;
重写Equals 和GetHashCode 也很好,以便能够轻松地比较值或将它们添加到字典或哈希集。
public bool Equals(Logical other) // Implements IEquatable<Logical>
{
return Value.Equals(other.Value);
}
public override bool Equals(object obj)
{
if (obj is Logical logical) {
return Equals(logical);
}
return base.Equals(obj);
}
public override int GetHashCode() => Value.GetHashCode();
如果覆盖Equals,自然会重载==和!=
public static bool operator ==(Logical a, Logical b) => a.Value == b.Value;
public static bool operator !=(Logical a, Logical b) => a.Value != b.Value;
最后,我们覆盖 ToString 以便能够打印逻辑。
public override string ToString() => Value == 0 ? "FALSE" : "TRUE";
现在,我们可以做这些事情了:
double x = 3.14;
Logical logical = x > 0.0;
bool b = logical;
Console.WriteLine($"logical = {logical}");
Console.WriteLine($"b = {b}");
logical = -3;
Console.WriteLine($"logical = {logical}");
Console.WriteLine($"logical.Value = {logical.Value}");
logical = 0;
Console.WriteLine($"logical = {logical}");
Console.ReadKey();
打印出来:
logical = TRUE
b = True
logical = TRUE
logical.Value = 1
logical = FALSE
您还可以做更多事情。例如,System.Bool 实现了 IComparable、IComparable<bool>、IConvertible 和 IEquatable<bool>。它还具有静态 Parse 和 TryParse 方法。您还可以重载其他运算符。请参阅:Overloadable operators (Operator overloading, C# reference)。