2008-12-01 11 views

Trả lời

207

Vấn đề không phải là không thể gán giá trị cho một int ?. Vấn đề là cả hai giá trị được trả về bởi toán tử bậc ba phải cùng loại, hoặc một giá trị phải chuyển đổi hoàn toàn với giá trị khác. Trong trường hợp này, null không thể được chuyển đổi hoàn toàn sang int hay ngược lại, do đó, cần phải có một phôi explict. Hãy thử điều này thay vì:

int? accom = (accomStr == "noval" ? (int?)null : Convert.ToInt32(accomStr)); 
+3

Thật thú vị - bạn không thực sự cần các diễn viên cho Convert.ToInt32 ... –

+1

Nó vì System.Int32 = System.Nullable

+1

Tại sao dài! ? làm việc mà không có diễn viên? –

36

gì Harry S nói là hoàn toàn đúng, nhưng

int? accom = (accomStr == "noval" ? null : (int?)Convert.ToInt32(accomStr)); 

cũng sẽ làm các trick. (Chúng tôi Resharper người dùng luôn có thể nhận ra nhau trong đám đông ...)

+1

Bây giờ đó là tốt đẹp, đó chỉ là một sự khác biệt tinh tế nhưng sooo đơn giản! Sẽ +2 nếu tôi có thể (mặc dù nó là một điều nhỏ như vậy) =) – Coops

5

Một lựa chọn khác là sử dụng

int? accom = (accomStr == "noval" ? Convert.DBNull : Convert.ToInt32(accomStr); 

Tôi thích cái này nhất.

+0

Bạn đã thực sự thử điều này? Nó sẽ cung cấp cho các lỗi "Không thể chuyển đổi rõ ràng loại 'đối tượng' để 'int?'. Một chuyển đổi rõ ràng tồn tại (là bạn thiếu một diễn viên?)" –

1

Tương tự như vậy tôi đã làm trong thời gian dài:

myLongVariable = (!string.IsNullOrEmpty(cbLong.SelectedItem.Value)) ? Convert.ToInt64(cbLong.SelectedItem.Value) : (long?)null;