Trình biên dịch biết rằng một chuỗi không bao giờ có thể là int?
để nó cho bạn biết điều đó. Điều đó không có nghĩa là int?
không hữu ích. Trường hợp sử dụng đã cố gắng của bạn cách xa trường hợp bình thường. Điều bình thường là "Tôi muốn đại diện cho một số nguyên và khả năng giá trị bị thiếu/không rõ". Để làm được điều đó, int?
hoạt động rất tốt.
Tại sao bạn mong đợi mã ban đầu của bạn hoạt động? Tại sao nó sẽ hữu ích?
Lưu ý rằng bạn có thể sử dụng as
với các loại nullable, cho unboxing:
object o = "hello";
int? i = o as int?;
if (i == null)
{
// o was not a boxed int
}
else
{
// Can use i.Value to recover the original boxed value
}
EDIT: Đã thấy bình luận của bạn, bạn không sử dụng as
để phân tích mọi thứ. Bạn có thể muốn sử dụng int.TryParse
:
string text = "123":
int value;
if (int.TryParse(text, out value))
{
Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
Console.WriteLine("Unable to parse text as an integer");
}
Nếu bạn chắc chắn chuỗi được hiểu là một số nguyên (tức là nó là một lỗi khác) sau đó bạn chỉ có thể sử dụng int.Parse
:
int value = int.Parse(text);
Đó sẽ ném một ngoại lệ nếu phân tích cú pháp không thành công. Lưu ý rằng cả hai phương pháp này đều cho phép bạn chỉ định nhà cung cấp định dạng (thường là thông tin văn hóa) cho phép bạn thể hiện cách các số được biểu thị theo định dạng đó (ví dụ: hàng nghìn dấu phân cách).
EDIT: Trong câu trả lời cho câu hỏi mới của bạn, trình biên dịch ngăn chặn điều này bởi vì nó biết một chuỗi không thể có thể là một hộp đóng gói - chuyển đổi sẽ không bao giờ thành công.Khi nó chỉ biết rằng giá trị ban đầu là một đối tượng, nó có thể thành công.
Ví dụ: giả sử tôi đã nói với bạn, "Đây là hình dạng: có phải là hình vuông không?" Đó là một câu hỏi hợp lý. Nó là hợp lý để hỏi nó: bạn không thể nói mà không nhìn vào hình dạng.
Nếu, tuy nhiên, tôi đã nói: "Đây là hình tam giác: có phải là hình vuông không?" Sau đó, bạn sẽ được hợp lý có quyền cười trên khuôn mặt của tôi, như một hình tam giác không thể có thể là một hình vuông - câu hỏi không có ý nghĩa.
vì bạn đang cố gắng gán một giá trị chuỗi đến một int. dấu hỏi chỉ cho phép int chứa một giá trị null, nó không thay đổi thực tế là nó là một int. – kscott
Juan: Bạn không sử dụng dàn diễn viên hoặc "dưới dạng" để chuyển đổi giữa các chuỗi và các loại khác. Không có sẵn chuyển đổi ngầm hoặc rõ ràng - bạn phải sử dụng phương pháp phân tích cú pháp. Xem phần thứ hai của câu trả lời của tôi để biết chi tiết và một ví dụ. –
Không - Tôi sẽ không bao giờ mong đợi một nhà điều hành chuyển đổi cố gắng phân tích cú pháp. Rất tiếc - có vẻ như tôi đã hiểu sai câu hỏi đã chỉnh sửa của bạn, tôi nghĩ điều đó cho biết bạn * đã cố gắng tìm cách để thực hiện chuyển đổi.Tôi sẽ để lại thông tin bổ sung cho người đọc trong tương lai. –