对于作业,我必须使用结构在C#中编写Tribool类。只有三种可能的tribools,True,False和Unknown,我将这些声明声明为静态只读。像这样:
public static readonly Tribool True, False, Unknown;
我需要我的默认构造函数来提供一个错误的Tribool,但我不知道如何解决这个问题。我已经尝试Tribool() { this = False; }
和Tribool() { False; }
,但我不断收到“Structs不能包含显式无参数构造函数”错误。
赋值指定Tribool的默认构造函数应提供False Tribool。否则,用户不应该能够创建任何其他Tribools。我现在还不知道该怎么做。任何建议将不胜感激。感谢。
答案 0 :(得分:10)
只是为Jason的答案添加一点:仔细设计你的结构,以便默认值是有意义的。例如,考虑Nullable<T>
结构。当你说
Nullable<int> x = new Nullable<int>(); // default constructor
结果值在逻辑上为空。我们怎么做?结构定义如下:
struct Nullable<T>
{
private readonly T value;
private readonly bool hasValue;
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
...
因此,当默认构造函数运行时,hasValue会自动设置为false,并且value将设置为默认值T.将hasValue设置为false的nullable视为null,这是所需的行为。这就是为什么bool是 hasValue 而不是 isNull 。
答案 1 :(得分:6)
正如错误告诉你的那样,你绝对不能拥有一个struct的无参数实例构造函数。参见C#3.0语言规范的§11.3.8:
与类不同,不允许结构体声明无参数实例构造函数。
该语言为您提供了一个默认构造函数。此构造函数返回结构的值,其中字段已设置为其默认值。
现在,您可以做的是使用struct的默认值表示False
值。我会把细节留给你。
答案 2 :(得分:0)
比赛迟到但是,你有没有理由不使用枚举?
毕竟,如果你只需要一个Trinary值那么结构就是大量的过度杀伤
public enum Tribool{
Unknown =0,
True = -1,
False = 1
}