Решение
Вы можете использовать new Guid()
вместо
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Вы также можете использовать default(Guid)
default(Guid)
и будет работать точно так же new Guid()
.
Поскольку Guid является типом значения, а не ссылочным типом, то default(Guid)
есть не равен, null
например, вместо этого он равен вызову конструктора по умолчанию.
Что означает, что это:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Это точно так же, как оригинальный пример.
объяснение
Почему не Guid.Empty
работает?
Причина, по которой вы получаете ошибку, заключается в том, что Empty
она определяется как:
public static readonly Guid Empty;
Таким образом, это является переменной, не является постоянным (определяется как static readonly
не так const
). Компилятор может иметь только значения, известные компилятору, в качестве значений параметров метода по умолчанию (не известно только во время выполнения).
Основная причина в том, что вы не можете иметь const
ничего struct
, в отличие от, enum
например. Если вы попробуете это, он не скомпилируется.
Причина еще раз в том, что struct
это не примитивный тип.
Список всех примитивных типов в .NET см. По адресу http://msdn.microsoft.com/en-gb/library/system.typecode.aspx
(обратите внимание, что enum
обычно наследуется int
, что является примитивом)
Но new Guid()
тоже не константа!
Я не говорю, что нужна постоянная. Нужно что-то, что можно решить во время компиляции. Empty
это поле, поэтому его значение неизвестно во время компиляции (только в самом начале времени выполнения).
Значение параметра по умолчанию должно быть известно во время компиляции, которое может быть const
значением или определенным с помощью функции C #, которая делает значение известным во время компиляции, например default(Guid)
или new Guid()
(которое определяется во время компиляции для struct
s, поскольку вы не можете изменить struct
конструктор в код).
Хотя вы можете предоставить default
или new
легко, вы не можете предоставить const
(потому что это не примитивный тип или enum
как описано выше). Итак, опять же, не говоря о том, что самому необязательному параметру нужна постоянная, но известная компилятору величина.