2012-04-25 29 views
17

Từ trang MSDN:Tại sao Convert.ToDouble (char) không được hỗ trợ?

public static double ToDouble( char value )

thông số

giá trị
Loại: System.Char Các ký tự Unicode để chuyển đổi.

Return Value
Loại: System.Double chuyển đổi này không được hỗ trợ. Không có giá trị nào được trả về.

Nếu nó không được hỗ trợ, tại sao nó được triển khai ngay từ đầu?

+3

Có lẽ vì nó phải là, đối với một số giao diện, IConvertible, có thể? Hoặc chỉ để giữ một tiêu chuẩn.Đừng để nó bị thiếu và tìm kiếm - nhưng nói "ở đây nó là, không sử dụng nó mặc dù" – SimpleVar

+8

@YoryeNathan 'Convert' là một lớp tĩnh, nó không thực hiện bất kỳ giao diện nào. 'Char' thực hiện' IConvertible', và * của nó * ToDouble' là cần thiết cho điều đó, nhưng 'Convert' không cần nó. Thay thế của bạn, "để giữ một tiêu chuẩn", có thể đúng. – hvd

+0

@hvd Bạn nói đúng. Đó là ngu ngốc của tôi. – SimpleVar

Trả lời

5

Nó không phải là duy nhất. Convert.ToBoolean (char), ToDateTime, ToDecimal và ToSingle cũng không được hỗ trợ, tất cả đều ném InvalidCastException như ToDouble.

Đây chỉ là thiết kế .NET đang cố gắng giúp bạn không gặp rắc rối. Chuyển đổi một char thành một kiểu tích phân là hợp lý, bạn có thể xem các bảng ánh xạ Unicode và đếm các điểm mã (codepoint). Nhưng Boolean có nghĩa là gì? Điểm mã Unicode nào là True? ToDateTime không yêu cầu giải thích. Làm cách nào một ký tự có thể là giá trị phân đoạn? Không có một nửa hoặc một phần tư.

Bạn có thể làm cho nó hoạt động, chuyển sang Int32 trước rồi chuyển đổi thành Đôi. Nhưng bằng mọi cách, hãy kiểm tra mã của bạn và đảm bảo rằng đó là một điều ý nghĩa cần làm. Các nhà thiết kế .NET nghĩ rằng nó không phải. Họ đã đúng.

+1

Điều đó có ý nghĩa. Tuy nhiên 'double doubleChar = (double) 'a'; // OK' và 'var doubleValue = Convert.ToDouble ('a'); // InvalidCastException' hơi không nhất quán. – oleksii

+0

Hehe, các nhà thiết kế chỉ không có sức mạnh để ném nó. Ngôn ngữ quy tắc trump thiết kế khung. –

2

Mỗi ký tự có một số nguyên tương ứng. Ví dụ:

Convert.ToInt16('a') -> returns 97. 

Tôi đoán lý do chính tại sao Chuyển đổi không hỗ trợ chuyển đổi từ char loại khác là bản chất thứ hai của một ký tự là loại số nguyên.

Có lẽ một ví dụ rõ ràng hơn là đoạn mã sau:

char a = 'a'; 
int aVal = (int)a; 

nào thực sự Convert.ToInt32 không (nhưng cũng làm dấy lên những ngoại lệ tràn)

1
+1

Điều đó không thực sự trả lời câu hỏi, cho rằng 'Chuyển đổi' có rất nhiều phương thức chuyển đổi giữa các loại có chuyển đổi tiềm ẩn với nhau. – Joey

+2

@Joey Nó thực sự trả lời câu hỏi. Không có quá tải 'Convert.ToDouble (char)' để ném một ngoại lệ, một quá tải khác mà không ném một ngoại lệ sẽ được chọn, và 'Convert.ToDouble (char)' sẽ không còn hoạt động giống như '((IConvertible) nữa. char) .ToDouble() '. – hvd

2

Theo MSDN, chức năng này được giữ lại để sử dụng trong tương lai trong .Net 2.0 và nó được giữ cho đến 4.5 để hỗ trợ phiên bản trước của khung .net.

Họ sẽ triển khai điều này nếu hệ điều hành trong tương lai sẽ hỗ trợ loại chuyển đổi này. Hiện tại, hệ điều hành lưu trữ các char như int, do đó, không cung cấp cách để đúc char để tăng gấp đôi do rất nhiều chuyển đổi bên trong.

Do định dạng lưu trữ nội bộ, cùng một giới hạn là với Convert.ToDouble (DateTime).

Các vấn đề liên quan