Tôi mong chờ ba dòng tiếp theo của mã để được như vậy:sử dụng coalescing điều hành null trên các loại nullable thay đổi ngầm loại
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
Trong mọi trường hợp, tôi gán nullableDateTime
vào biến mới. Tôi hy vọng loại của tất cả các biến sẽ trở thành DateTime?
vì đó là loại nullableDateTime
. Nhưng với sự ngạc nhiên của tôi, loại dateTimeWhatType
chỉ trở thành DateTime
, vì vậy không thể vô hiệu. Để làm cho mọi việc tồi tệ hơn, ReSharper gợi ý thay thế câu lệnh thứ hai bằng một biểu thức kết hợp rỗng, biến nó thành biểu thức 3. Vì vậy, nếu tôi để ReSharper làm điều đó, kiểu biến sẽ thay đổi từ DateTime?
thành DateTime
.
Trong thực tế, chúng ta hãy nói rằng trong thời gian còn lại của phương pháp này, tôi sẽ sử dụng
if (someCondition) dateTimeNullable2 = null;
Điều đó sẽ biên dịch tốt, cho đến khi tôi để cho ReSharper thay thế biểu thức thứ hai với phiên bản coalescing null.
AFAIK, thay thế
somevar != null ? somevar : somedefault;
với
somevar ?? somedefault;
thực sự nên tạo ra kết quả tương tự. Nhưng đối với việc gõ ngầm định trên một kiểu nullable, trình biên dịch dường như đe dọa ??
như thể nó có nghĩa là.
somevar != null ? somevar.Value : somedefault;
Vì vậy, tôi đoán câu hỏi của tôi là lý do tại sao các loại ngầm được thay đổi khi tôi sử dụng ??
, và cũng là nơi trong tài liệu tôi có thể tìm thông tin về vấn đề này.
BTW, đây không phải là một kịch bản thế giới thực, nhưng tôi muốn biết tại sao sử dụng ??
thay đổi loại (ẩn).
Tại sao bạn mong đợi 'nullableDateTime ?? DateTime.Now' để tạo ra một 'DateTime? ', Khi trình biên dịch có đủ thông tin để biết rằng kết quả sẽ không bao giờ là' null'? –
@Damien: trong ví dụ đầu tiên và thứ hai của tôi trình biên dịch cũng có đủ thông tin để biết kết quả sẽ không bao giờ là 'null'. Đó chính xác là lý do tại sao tôi thấy kiểu hành vi kỳ lạ này. – comecme
Nhưng '?: 'hỗ trợ một phạm vi lớn hơn nhiều đầu vào có thể (không có lý do gì' điều kiện' cần được kết nối với một trong hai kết quả 'biểu hiện' ở tất cả). Như vậy, sẽ không bình thường khi trình biên dịch được kiến trúc để thực hiện phân tích này chống lại '?:'. Trong khi đó, đối với '??', nó biết chính xác rằng kết quả sẽ là biểu thức đầu tiên mà không có khả năng biểu thức đó là null, hoặc biểu thức thứ hai. –