我正在尝试使用 http://www.boost.org/doc/libs/1_41_0/doc/html/tribool.html 作为引用来实现 Tribool 类型。
我正在使用结构体,因为它是一种原始类型,不应该是可扩展的。我知道有 3 种类型的 Tribool ---True、False 和 Unknown,默认构造函数应该提供 False Tribool。我的问题是,我将 True、False 和 Unknown 设置为什么数据类型?现在我有:
struct Tribool
{
//True, False, and Unknown public constants
public static readonly Tribool TRUE, FALSE, UNKNOWN;
//Constructors
public Tribool()
{
Tribool = FALSE; //use ValueType instead?
}
但我不确定这是否正确,因为看起来我只是将一个 Tribool 设置为另一个 Tribool。我应该改用 ValueType 吗?我在 VS 打字的时候就弹出来了,听上去很有道理,但是我在谷歌上找不到很多关于它的信息。
此外,Tribool 需要能够与常规 bool 值一起操作,这意味着“真”和“假”需要重载。这是否需要运算符重载?或者它应该只是一个返回 bool 值的方法?
提前致谢!
编辑:对不起,我应该提到这是一个任务。所以我不能使用 bool,尽管正如你们中的许多人指出的那样,它更实用。
最佳答案
bool?
完毕。那做?特别是,C# 编译器将为您提供“提升”运算符以映射到
bool
。不过,可以说,它可能比 bool
或单个枚举稍大。注意:不要使用
ValueType
,因为这实际上是一个装箱操作。如果你不能使用
bool?
(即你想从头开始实现),我会将它映射到一个 enum
(可能是一个 byte
枚举,但我会默认为 int
正常):public struct Tribool : IEquatable<Tribool> {
public static Tribool True { get { return new Tribool(true); } }
public static Tribool False { get { return new Tribool(false); } }
public static Tribool Unknown { get { return new Tribool(); } }
enum TriboolState { Unknown = 0, True = 1, False = 2 }
private readonly TriboolState state;
public Tribool(bool state) {
this.state = state ? TriboolState.True : TriboolState.False;
}
// default struct ctor handles unknown
public static bool operator true(Tribool value) {
return value.state == TriboolState.True;
}
public static bool operator false(Tribool value) {
return value.state == TriboolState.False;
}
public static bool operator ==(Tribool x, Tribool y) {
return x.state == y.state;
}
public static bool operator !=(Tribool x, Tribool y) {
return x.state != y.state; // note: which "unknown" logic do you want?
// i.e. does unknown == unknown?
}
public override string ToString() {
return state.ToString();
}
public override bool Equals(object obj) {
return (obj != null && obj is Tribool) ? Equals((Tribool)obj) : false;
}
public bool Equals(Tribool value) {
return value == this;
}
public override int GetHashCode() {
return state.GetHashCode();
}
public static implicit operator Tribool(bool value) {
return new Tribool(value);
}
public static explicit operator bool(Tribool value) {
switch (value.state) {
case TriboolState.True: return true;
case TriboolState.False: return false;
default: throw new InvalidCastException();
}
}
}
关于c# - C# 中的 Tribool 实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2174989/