Giải pháp
Bạn có thể sử dụng new Guid()
thay thế
public void Problem(Guid optional = new Guid())
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Bạn cũng có thể dùng default(Guid)
default(Guid)
cũng sẽ làm việc chính xác như new Guid()
.
Vì Guid là loại giá trị không phải là loại tham chiếu, do đó, default(Guid)
không bằng null
với ví dụ, thay vào đó, nó bằng với việc gọi hàm tạo mặc định.
Điều đó có nghĩa là điều này:
public void Problem(Guid optional = default(Guid))
{
// when called without parameters this will be true
var guidIsEmpty = optional == Guid.Empty;
}
Nó chính xác giống như ví dụ ban đầu.
Giải trình
Tại sao không Guid.Empty
làm việc?
Lý do bạn nhận được lỗi là vì Empty
được định nghĩa là:
public static readonly Guid Empty;
Vì vậy, nó là một biến, không phải là hằng số (được định nghĩa là static readonly
không phải const
). Trình biên dịch chỉ có thể có các giá trị được biết đến của trình biên dịch làm các giá trị mặc định của tham số phương thức (không phải chỉ biết về thời gian chạy).
Nguyên nhân sâu xa là bạn không thể có const
bất kỳ nguyên nhân nào struct
, không giống enum
như. Nếu bạn thử nó, nó sẽ không biên dịch.
Lý do một lần nữa là đó struct
không phải là một loại nguyên thủy.
Để biết danh sách tất cả các loại nguyên thủy trong .NET, hãy xem http://msdn.microsoft.com/en-gb/l Library / system.typecode.aspx
(lưu ý enum
thường là kế thừa int
, đó là một nguyên thủy)
Nhưng new Guid()
không phải là một hằng số quá!
Tôi không nói rằng nó cần một hằng số. Nó cần một cái gì đó có thể được quyết định trong thời gian biên dịch. Empty
là một trường, vì vậy, giá trị của nó không được biết đến trong thời gian biên dịch (chỉ khi bắt đầu thời gian chạy).
Giá trị tham số mặc định phải được biết tại thời gian biên dịch, có thể là const
giá trị hoặc được xác định bằng cách sử dụng tính năng C # để tạo giá trị được biết tại thời gian biên dịch, như default(Guid)
hoặc new Guid()
(được quyết định tại thời gian biên dịch cho struct
s khi bạn không thể sửa đổi hàm struct
tạo trong mã).
Mặc dù bạn có thể cung cấp default
hoặc new
dễ dàng, bạn không thể cung cấp const
(vì đó không phải là loại nguyên thủy hoặc enum
như đã giải thích ở trên). Vì vậy, một lần nữa, không nói rằng chính tham số tùy chọn cần một giá trị không đổi, nhưng trình biên dịch đã biết.