В .NET тип значения (С# struct
) не может иметь конструктор без параметров. Согласно этому сообщению, это определяется спецификацией CLI. Случается, что для каждого типа значений создается конструктор по умолчанию (компилятором?), Который инициализировал все члены до нуля (или null
).
Почему не разрешено определять такой конструктор по умолчанию?
Одно простое использование для рациональных чисел:
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
Используя текущую версию С#, по умолчанию Rational является 0/0
, что не так круто.
PS: параметры по умолчанию помогут решить эту проблему для С# 4.0 или будет вызываться конструктор по умолчанию CLR?
Jon Skeet ответил:
Чтобы использовать ваш пример, что бы вы хотели сделать, когда кто-то сделал:
Rational[] fractions = new Rational[1000];
Должен ли он работать через ваш конструктор 1000 раз?
Конечно, это должно, поэтому я написал конструктор по умолчанию в первую очередь. CLR должен использовать конструктор обнуления по умолчанию, если не определен явный конструктор по умолчанию; таким образом вы платите только за то, что используете. Тогда, если мне нужен контейнер из 1000 нестандартных Rational
(и вы хотите оптимизировать 1000 конструкций), я буду использовать List<Rational>
, а не массив.
Эта причина, на мой взгляд, недостаточно сильна, чтобы предотвратить определение конструктора по умолчанию.