覆盖C#结构中的默认值

时间:2010-02-02 04:31:53

标签: c# struct

对于作业,我必须使用结构在C#中编写Tribool类。只有三种可能的tribools,True,False和Unknown,我将这些声明声明为静态只读。像这样:

public static readonly Tribool True, False, Unknown;

我需要我的默认构造函数来提供一个错误的Tribool,但我不知道如何解决这个问题。我已经尝试Tribool() { this = False; }Tribool() { False; },但我不断收到“Structs不能包含显式无参数构造函数”错误。

赋值指定Tribool的默认构造函数应提供False Tribool。否则,用户不应该能够创建任何其他Tribools。我现在还不知道该怎么做。任何建议将不胜感激。感谢。

3 个答案:

答案 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
}