Перезапись значений по умолчанию в структурах C # - PullRequest
2 голосов
/ 02 февраля 2010

Для выполнения задания я должен написать класс Tribool на C #, используя struct. Существует только три возможных трибула: True, False и Unknown, и я объявил их как статические только для чтения. Как это:

public static readonly Tribool True, False, Unknown;

Мне нужен мой конструктор по умолчанию для предоставления False Tribool, но я не уверен, как это сделать. Я пробовал Tribool() { this = False; } и Tribool() { False; }, но продолжаю получать ошибку "Structs не может содержать явных конструкторов без параметров".

В назначении указано, что конструктор по умолчанию для Tribool должен предоставлять False Tribool. В противном случае пользователь не сможет создавать другие Tribools. Я действительно не знаю, что делать в этот момент. Любой совет будет принята с благодарностью. Спасибо.

Ответы [ 3 ]

10 голосов
/ 02 февраля 2010

Просто добавим немного ответа Джейсона: тщательно спроектируйте структуру, чтобы значение по умолчанию имело смысл. В качестве примера рассмотрим структуру 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, а для значения устанавливается значение по умолчанию T. Обнуляемое значение, для которого hasValue установлено в значение false, рассматривается как ноль, что является желаемым поведением. Вот почему значение bool имеет значение , а не isNull .

6 голосов
/ 02 февраля 2010

Как говорит ошибка, вы абсолютно не можете иметь конструктор экземпляра без параметров для структуры. См. §11.3.8 спецификации языка C # 3.0:

В отличие от класса, структура не может объявлять конструктор экземпляра без параметров.

Язык предоставляет один для вас известный как конструктор по умолчанию. Этот конструктор возвращает значение структуры, где поля были установлены в их значения по умолчанию.

Теперь, что вы могли бы сделать, это иметь значение по умолчанию структуры, представляющей значение False Я оставлю вам детали.

0 голосов
/ 21 декабря 2010

Немного опоздал к игре, но есть ли причина, по которой вы не используете enum?

в конце концов, если вам просто нужно значение Trinary, тогда структура является чрезмерным излишним

public enum Tribool{
    Unknown =0,
    True = -1,
    False = 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...