Рішення
Ви можете використовувати 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
пояснення, описане вище). Отже, знову ж таки, не кажучи, що необов'язковий параметр сам по собі потребує постійного, але відомого компілятора значення.