2011-06-28 42 views
5
var dict = new Dictionary<string, object>(); 
DateTime? myDate; 

/*Next line gives: Type of conditional expression cannot be 
determined because there is no implicit conversion between 'System.DateTime?' 
and 'System.DBNull' */ 

dict.Add("breakit", myDate.HasValue ? myDate.Value : DBNull.Value); 

Tôi không hiểu tại sao cần phải có chuyển đổi tiềm ẩn nếu một hoặc chuyển đổi khác đi vào một loại đối tượng mong đợi từ điển.Tại sao tôi không thể sử dụng toán tử bậc ba với biểu thức này?

+2

Đây là một cực kỳ câu hỏi thường gặp về SO. Xem http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959 để biết chi tiết. Xem thêm bài viết liên quan của tôi http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law.aspx –

+0

@Eric I'll kiểm tra xem nó ra. Cảm ơn! – scottm

+1

Bạn được chào đón. Vấn đề là bạn đang lý luận theo hướng ngược lại vì lý do trình biên dịch. Bạn đang nói "Tôi biết rằng điều này đang đi đến một cái gì đó mà hy vọng đối tượng". Nhưng trình biên dịch không biết rằng bạn * ưu tiên * mong muốn phương thức "đối tượng" được chọn. Trình biên dịch đang cố gắng lý luận theo cách khác. Đó là yêu cầu "là phương pháp mà hy vọng đối tượng tương thích với biểu thức này?" Để biết rằng nó phải hỏi "Loại biểu thức là gì?" ** Vấn đề là nó không thể làm việc ra loại biểu thức để quyết định xem biểu thức có hoạt động hay không. ** –

Trả lời

6

Trong C#, mọi biểu thức có điều kiện phải có loại. Loại biểu hiện của bạn là gì?

Tôi hiểu mối lo ngại của bạn, việc chuyển đổi không cần thiết cho trường hợp cụ thể của bạn, nhưng đây là cách trình biên dịch C# hoạt động, vì vậy bạn phải tuân theo các quy tắc của nó.

này nên làm việc thay vì (tôi đã không kiểm tra mặc dù):

dict.Add("breakit", myDate.HasValue ? (object)myDate.Value : (object)DBNull.Value); 
+0

Biểu thức của tôi phải thuộc loại System.DateTime hoặc DBNull tùy thuộc vào điều kiện của myDate.Value – scottm

+0

Truyền tới đối tượng không hoạt động. – scottm

+0

thì đó không phải là loại tĩnh, mà là kiểu động. Trình biên dịch C# là kiểu tĩnh (ngoài một số cơ chế 'động' mà tôi không chắc chắn về). – Zruty

1

Bạn có thử:

DateTime? date = myDate.HasValue ? myDate.Value : null; 

dict.Add("breakit", date); 
+1

Điều này cho cùng một lỗi. – scottm

+0

Mặc dù, tôi không hiểu tại sao chúng ta cần phải bỏ qua đối tượng khi nó là lớp cơ sở chính! –

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