2012-06-19 5 views
4

Как создать новый тип в C#? Например, байт имеет диапазон от 0 до 255, но мне нужен новый тип, который будет иметь диапазон от 0 до 10.Как объявить новый тип

+1

Как обычно вы создаете новый тип? public class blah .... Создание нового типа для этого кажется довольно бессмысленным ... –

+0

Вы уверены, что вам нужен новый тип, а не только проверка ввода? –

+0

Как установить проверку диапазона и проверку типов во время компиляции? Например, я не могу установить строку для байтового типа, я получаю ошибку компиляции. Как сделать то же самое для моего типа? – Tomas

ответ

4

Удивительно, что люди хотят закрыть это как не настоящий вопрос!

Ответ заключается в том, что C# не имеет системы типов, которая поддерживает проверку целых диапазонов во время компиляции, за исключением нескольких встроенных случаев: она перестает назначать номера большего диапазона номерам меньшего диапазона. Но диапазоны для этих чисел заранее определены в спецификации языка.

+4

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

0

Вы создаете класс, который обертывает byte (или int, если вам нужен больший диапазон).
Затем вы определяете обычные операции - *, /, - ... Для этого вы можете использовать перегрузку оператора.
Вы добавляете некоторые проверки, чтобы увидеть, остается ли значение в пределах границ и в противном случае выбрасывать соответствующее исключение.
Вот краткий пример:

class LimitedRangeValue 
{ 
    private static readonly int maxval = 10; 
    private static readonly int minval = 0; 
    private int n; 

    public LimitedRangeValue(int n) 
    { 
     if (n < minval || n > maxval) 
      throw new OverflowException(); 
     this.n = n; 
    } 

    public static LimitedRangeValue operator +(LimitedRangeValue r1, LimitedRangeValue r2) 
    { 
     return new LimitedRangeValue(r1.n + r2.n); 
    } 

    // Other operators by analogy 

    public override string ToString() 
    { 
     return n.ToString(); 
    } 
} 

EDIT: Как Barber указывает @ Андрей в комментариях, вы можете использовать код контракты для (за дополнительную плату) проверки.

+0

Я думаю, вы обнаружите, что C# * имеет * перегрузку оператора ... http://msdn.microsoft.com/en-us/library/8edha89s%28VS.71%29.aspx –

+0

@BradleySmith Спасибо! Не знал этого; соответственно изменили ответ. –

Смежные вопросы