2012-02-16 34 views
14

Tôi không thể hiểu tại sao điều này sẽ không làm việcTại sao tôi không thể gán null cho thập phân với toán tử bậc ba?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+2

Chúng tôi không quan tâm đến người đọc, những gì không hiệu quả? –

+2

Nó được gọi là toán tử điều kiện, không phải toán tử bậc ba –

+0

@JakubKonecki mặc dù nó rõ ràng. Luôn luôn cung cấp càng nhiều thông tin càng tốt. Trong trường hợp này, lỗi biên dịch –

Trả lời

34

null thuộc loại object (không được nhập sai) và bạn cần gán nó cho đối tượng đã nhập.

này nên làm việc:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : (decimal?)null; 

hoặc đây là một chút tốt hơn:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : default(decimal?); 

Dưới đây là liên kết MSDN cho từ khóa default.

+0

Cảm ơn rất nhiều slugster. –

+1

fanbloodytastic! – northpole

+3

Phản hồi tốt nhất là câu trả lời không chỉ trả lời mà còn thông báo và giáo dục .. tốt nhất một slugster –

2

Bạn cần phải cast phần đầu tiên để decimal?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+1

Điều đó sẽ không tạo ra sự khác biệt. Một 'số thập phân' có thể được đưa vào một số thập phân?'. –

+0

"Loại đầu ra của toán tử bậc ba là loại phần đầu tiên": điều này không đúng ... nó có thể là loại phần đầu hoặc phần thứ hai, tùy thuộc vào chuyển đổi nào tồn tại giữa chúng –

+1

Bạn có thể gán 'decimal' thành một số thập phân' 'mà không có phép đúc rõ ràng. – slugster

3
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
          decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) : 
          (decimal?)null; 
5

Hãy thử điều này:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
         decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) : 
         (decimal?) null; 

Các vấn đề là trình biên dịch không biết loại null có. Vì vậy, bạn chỉ có thể truyền nó đến decimal?

3

Vì trình biên dịch không thể suy ra loại tốt nhất từ ​​các toán hạng của toán tử điều kiện.

Khi bạn viết condition ? a : b, thì phải có một chuyển đổi ngầm từ các loại a để loại b, hoặc từ các loại b để loại a. Trình biên dịch sau đó sẽ suy ra loại biểu thức toàn bộ làm loại mục tiêu của chuyển đổi này. Thực tế là bạn gán nó cho một biến kiểu decimal? không bao giờ được trình biên dịch xem xét. Trong trường hợp của bạn, các loại abdecimal và một số tham chiếu không xác định hoặc loại có thể vô hiệu hóa. Trình biên dịch không thể đoán ý bạn là gì, vì vậy bạn cần trợ giúp:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
          ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
          : default(decimal?); 
6

Không sử dụng decimal.Parse.

Convert.ToDecimal sẽ trả về 0 nếu được cung cấp một chuỗi rỗng. decimal.Parse sẽ ném một ArgumentNullException nếu chuỗi bạn muốn phân tích cú pháp là null.

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