Câu trả lời ngắn:
DateTime?
chỉ là một cú pháp ngọt ngào cho Nullable<DateTime>
mà không chứa DateTime
's thuộc tính và phương thức trong khi các nhà điều hành Elvis hoạt động trên không-Nullable Nullable<DateTime>.Value
.
Giải thích:
Các mã sau đây:
DateTime? dt = DateTime.Now;
string x;
if (dt != null)
x = dt?.ToString("dd/MM/yyyy");
Khi dịch ngược như C# 5.0
mang lại kết quả sau:
DateTime? nullable = new DateTime?(DateTime.Now);
if (nullable.HasValue)
{
string str = nullable.HasValue ? nullable.GetValueOrDefault().ToString("dd/MM/yyyy") : null;
}
Side lưu ý: string
dường như tuyên bố bên trong if
là không thích hợp vì cẩu ở cấp MSIL
, và vì giá trị không được sử dụng sau trên decompiler cho thấy nó như thể nó đã được công bố bên trong phạm vi if
.
Như bạn thấy, và kể từ DateTime?
chỉ là một cú pháp ngọt ngào cho Nullable<DateTime>
, C#
có một tham chiếu cụ thể cho Nullable<T>
s với các nhà điều hành Elvis, làm cho giá trị trả về của nó T không nullable tự .
Kết quả của toàn bộ Elvis operator
phải Nullable
do đó, nếu bạn muốn nhận được một string
giá trị phi nó sẽ phải là một trong hai Nullable<T>
hoặc một ReferenceType
nhưng điều này không làm thay đổi thực tế rằng nếu nhà điều hành đã tự quản lý để tự nhận được giá trị Nullable<DateTime>
- số trả lại DateTime
không còn là Nullable<DateTime>
nữa.
Nguồn
2016-01-29 10:33:58
Sau khi đọc câu trả lời, tôi không thể giúp đỡ, nhưng cảm thấy rằng các giải pháp thực tế cho vấn đề của mình đi như thế, "Chỉ cần sử dụng' dt.Value.ToString() 'đã có" –
Nếu dt là null thì sao? –
Ya, chỉ cần gọi dt.Value.ToString() sẽ phát sinh nếu dt là null; bạn chắc chắn muốn sử dụng toán tử Elvis, không chỉ vì nó có tên tuyệt vời mà còn vì nó xử lý việc kiểm tra NULL cho bạn. dt? .Value.ToString() về cơ bản nói "Nếu dt không rỗng, thì truy cập thuộc tính Value và chuyển nó thành String; nếu nó IS null, bỏ qua cuộc gọi và không làm gì" –