Không có sự khác biệt giữa hai dòng này, bởi vì trình biên dịch, trong dòng thứ hai, hiểu rằng nó là một mảng kiểu int.Tại sao trình biên dịch không chuyển đổi var [] thành đối tượng [] trong C#?
var x = new int[] { 1, 2, 3 }; //Fine, x is int[]
var x = new [] { 1, 2, 3 }; //Fine, x is int[]
Nhưng tại sao tôi không thể làm điều này với các loại khác nhau? Tại sao trình biên dịch không chuyển đổi biến của tôi thành loại đối tượng?
var x = new object[] { 1, "df", 5 }; //Fine, x is object[]
var x = new [] { 1, "df", 5 }; //Error! "No best type found for implicity-typed-array"
EDIT:
Cảm ơn tất cả những câu trả lời của bạn. Nhưng tôi vẫn tự hỏi, những ưu điểm và khuyết điểm là gì để làm cho tất cả các biểu thức mà trình biên dịch không thể chuyển đổi thành loại object
? (Bởi vì tôi sử dụng ký hiệu var
có nghĩa là nó không thể là bất kỳ loại nào. Tôi hiểu như thế này.) Tại sao trình biên dịch không tìm thấy loại gần nhất của các thành viên mảng bằng cách đi lên cây thừa kế?
Bạn đã đọc thông số C# chưa? – BoltClock
Có, nhưng câu hỏi chủ yếu là "tại sao nó không được thực hiện theo cách này?" –
Damien_The_Unbeliever bình luận về câu trả lời của Joey nói tất cả, thực sự. Nó chỉ là quá nhiều công việc cho trình biên dịch, chưa kể đến việc suy luận 'đối tượng []' kết quả là khá trực quan đối với tôi. – BoltClock