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