Решение
Вы можете использовать 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()(которое определяется во время компиляции для structs, поскольку вы не можете изменить structконструктор в код).
Хотя вы можете предоставить defaultили newлегко, вы не можете предоставить const(потому что это не примитивный тип или enumкак описано выше). Итак, опять же, не говоря о том, что самому необязательному параметру нужна постоянная, но известная компилятору величина.