Convert.ToString(null)
trả lại
null
Đúng như tôi mong đợi.
Nhưng
Convert.ToString(null as object)
trả lại
""
Tại sao những điều này lại khác nhau?
Convert.ToString(null)
trả lại
null
Đúng như tôi mong đợi.
Nhưng
Convert.ToString(null as object)
trả lại
""
Tại sao những điều này lại khác nhau?
Câu trả lời:
Có 2 quá tải trong số ToString
đó hoạt động ở đây
Convert.ToString(object o);
Convert.ToString(string s);
Trình biên dịch C # về cơ bản cố gắng chọn quá tải cụ thể nhất sẽ hoạt động với đầu vào. Một null
giá trị chuyển đổi thành bất kỳ loại tài liệu tham khảo. Trong trường hợp string
này cụ thể hơn object
và do đó nó sẽ được chọn là người chiến thắng.
Trong phần null as object
bạn đã củng cố loại biểu thức là object
. Điều này có nghĩa là nó không còn tương thích với string
quá tải và trình biên dịch sẽ chọn object
quá tải vì nó tương thích duy nhất còn lại.
Các chi tiết thực sự khó hiểu về cách hoạt động của việc bẻ cà vạt này được đề cập trong phần 7.4.3 của thông số ngôn ngữ C #.
Convert.ToString(string)
nó chỉ là một chức năng nhận dạng trong khi Convert.ToString(object)
thực sự trải qua một con đường khó theo dõi hơn. Trong nháy mắt, tôi sẽ đồng ý rằng họ nên trả lại như cũ nhưng lớp có thể chuyển đổi của BCL không phải là thứ mà tôi rất am hiểu và có thể có lý do chính đáng cho sự khác biệt (mặc dù tôi vẫn nghi ngờ)
(string)null
, hoặc nếu bạn đối tượng được gọi là o, sau đó(string)o
Tiếp theo từ câu trả lời giải quyết quá tải tuyệt vời của JaredPar - câu hỏi vẫn là "tại sao Convert.ToString(string)
trả về null, nhưng Convert.ToString(object)
trả về string.Empty
"?
Và câu trả lời cho điều đó là ... bởi vì các tài liệu nói như vậy :
Convert.ToString (string) trả về "phiên bản chuỗi được chỉ định; không có chuyển đổi thực tế nào được thực hiện."
Convert.ToString (đối tượng) trả về "biểu diễn chuỗi của giá trị hoặc String.Empty nếu giá trị là null."
CHỈNH SỬA: Về việc liệu đây có phải là "lỗi trong thông số kỹ thuật", "thiết kế API rất tệ", "tại sao nó lại được chỉ định như thế này", v.v. - Tôi sẽ xem xét một số lý do tại sao tôi không thấy nó như một vấn đề lớn.
System.Convert
có các phương thức để chuyển đổi mọi kiểu cơ sở thành chính nó . Điều này thật kỳ lạ - vì không cần hoặc có thể chuyển đổi, vì vậy các phương thức kết thúc chỉ trả về tham số. Convert.ToString(string)
cư xử như nhau. Tôi cho rằng chúng ở đây cho các tình huống tạo mã.Convert.ToString(object)
có 3 lựa chọn khi được thông qua null
. Ném, trả về null hoặc trả về chuỗi.Empty. Việc ném sẽ có hại - gấp đôi vì vậy với giả định chúng được sử dụng cho mã đã tạo. Trả về null yêu cầu người gọi của bạn thực hiện kiểm tra null - một lần nữa, không phải là một lựa chọn tuyệt vời trong mã đã tạo. Trả về string.Empty có vẻ là một lựa chọn hợp lý. Phần còn lại của System.Convert
giao dịch với các loại giá trị - có giá trị mặc định.Convert.ToString(string)
có nghĩa là phá vỡ quy tắc "không có chuyển đổi thực tế". Vì System.Convert
là một lớp tiện ích tĩnh, nên mỗi phương thức có thể được coi là của riêng nó một cách hợp lý. Có rất ít trường hợp trong thế giới thực mà hành vi này phải "đáng ngạc nhiên", vì vậy hãy để tính khả dụng chiến thắng tính đúng đắn (có thể có).