2010-02-02 3 views
2

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

public static readonly Tribool True, False, Unknown; 

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

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

+0

Для себя я бы всегда делать государство в этом порядке 'Unknown, False, true'. Таким образом, не инициализированный Tribool по умолчанию не известен. – Oliver

ответ

6

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

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

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

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

+0

Большое спасибо за предложение. Просто интересно, если бы я не пытался перезаписать конструктор по умолчанию, каково было бы значение по умолчанию? Я думаю, что, возможно, я не полностью понимаю назначение. Кто-то упомянул, что у меня должна быть система для представления True/False/Unknown внутри самого класса Tribool вместо использования общедоступных статических констант readonly в качестве значений, и мне не нужен конструктор, поскольку он не делает ничего значимого ... Я не слишком уверен, что это значит, и как бы я определил True/False/Unknown tribools.Если бы вы могли мне это объяснить, я бы очень признателен. Благодаря! – Mel

+0

Да, ключ находит способ представления 'TriBool'. Это полностью зависит от вас, и «правильный путь» очень сильно зависит от того, что еще нужно делать с «TriBool». Но некоторые возможности: 1. использовать 'int' внутри, чтобы представлять' TriBool' с «false», соответствующий 0, «true», соответствующий 1 и «unknown», соответствующий -1. Или используйте два 'bool' внутри, один из которых называется« значение », а другой -« неизвестно »с« значением », представляющим« true »или« false », в зависимости от того, является ли оно« истинным »или« ложным », но только если 'unknown' является' false', иначе экземпляр представляет «unknown». – jason

+0

Наконец, вы должны подумать об этих представлениях или о том, что вы придумали, в контексте предпоследнего предложения моего ответа. – jason

10

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

+0

Когда я запускаю 'Nullable i = new Nullable (); Console.WriteLine (i.Value); 'code, я получил исключение во второй строке. Вы упомянули в ответе, что 'значение установлено на значение по умолчанию T'. На основании этого 'i.Value' должно быть' 0'. Но он выбрал исключение «{« Объект Nullable должен иметь значение ».}'. Зачем? Кроме того, 'i' был' null'. Зачем? Постскриптум Я знаю тип «Nullable». Просто любопытно узнать, как это было достигнуто? –

+0

Поле равно нулю. Доступ к ресурсу или броски. –

+0

Я не уверен, что вы подразумеваете под доступом к собственности или выбрасывает –

0

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

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

public enum Tribool{ 
    Unknown =0, 
    True = -1, 
    False = 1 
} 
+1

Вы не можете перегружать операторов на перечисление. Если вы использовали структуру, то вы можете перегрузить 'operator ~', 'operator &', 'operator |' и 'operator ^' с соответствующим поведением для трехсторонней логики. – kbolino