Rõ ràng, bạn không thể sử dụng mã số null
cho khóa, ngay cả khi khóa của bạn là loại có thể bị vô hiệu.Tại sao bạn không thể sử dụng null làm khóa cho Từ điển <bool ?, string>?
Mã này:
var nullableBoolLabels = new System.Collections.Generic.Dictionary<bool?, string>
{
{ true, "Yes" },
{ false, "No" },
{ null, "(n/a)" }
};
... kết quả trong ngoại lệ này:
Giá trị có thể không được null. Tên thông số: khóa
Mô tả: Một ngoại lệ chưa được xử lý xảy ra trong khi thực hiện yêu cầu web hiện tại. Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về lỗi và vị trí bắt nguồn từ mã.
[ArgumentNullException: Value cannot be null. Parameter name: key]
System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) +44
System.Collections.Generic.Dictionary'2.Insert(TKey key, TValue value, Boolean add) +40
System.Collections.Generic.Dictionary'2.Add(TKey key, TValue value) +13
Tại sao khuôn khổ NET sẽ cho phép một loại nullable cho một chìa khóa, nhưng không cho phép một giá trị null?
Tại sao bạn cần một từ điển cho điều này? Một câu lệnh switch hoàn thành cùng một công việc: 'string getLabel (giá trị bool?) {If (value == null) {...} else if {...} else {...}; } ' – Juliet
@ Juliet, câu chuyện dài, nhưng tôi sẽ cố gắng: Tôi sẽ sử dụng ba nhãn (có, không, n/a) ở ba vị trí khác nhau: (1) một' bool? -> label' converter, (2) công cụ chuyển đổi 'label -> bool?', và (3) 'SelectList' cho' DropDownMenu' (mà tôi vừa chuyển các giá trị từ điển). Theo DRY, tôi muốn các nhãn ở một nơi trong trường hợp sau này tôi đổi ý, nói Y, N, NA. Vì điều đó không được phép, tôi đã kết thúc với ba const (một cho mỗi nhãn) và một mảng chuỗi cho 'SelectList'. Không thuận tiện, nhưng đủ tốt. – devuxer
Đôi khi bạn phải quay lại C++ để xem logic đằng sau việc triển khai trong .NET .. Hãy xem câu trả lời của tôi bên dưới. –