![](/img/trans.png)
[英]Why can't I use the array initializer with an implicitly typed variable?
[英]Why can't I declare an implicitly typed array without an initializer?
當我在沒有初始化程序的情況下聲明數組num
時,為什么我必須在new
之后編寫int
? 例如
int[] num = new int[5];
對於另一個數組num1,
我先聲明它然后給它賦值,並且我沒有像new
的數組num
那樣輸入int
。
int[] num1 = new [] {1, 2, 3, 4};
為什么這個快捷方式對我的第一個例子不起作用?
如果提供數組的值,則可以推斷出數組的類型(在某些情況下,您的示例已滿足)。 由於值都是整數,因此編譯器能夠推斷出您需要一個整數數組。 如果您沒有提供任何值(或者如果值不能全部隱式轉換為其中一個值的類型),則無法推斷出數組的類型應該是什么,因此您需要指定明確地說。
使用值聲明數組的“完整”語法是new int[] {1, 2, 3, 4};
。
你的new [] {1, 2, 3, 4};
line是一種簡寫語法。 它是一個“隱式類型”數組。 因為值都是int
,所以數組自動聲明為int[]
。
你不能寫int[] x = new [5];
很簡單,這個功能還沒有被C#設計者實現。
因為您似乎期望編譯器推斷數組類型的方式基於賦值運算符左側的類型:
int[] num = new[5];
你的思考過程是:
num
是一個int
數組。 new[5]
是一系列的東西。 int
,因為這是num
的類型。 這不是編譯器的工作方式。 編譯器必須明確地找出賦值表達式右邊的類型,一旦它完成,它將檢查對左邊的任何內容的賦值是否有效。
在C#中允許的語法中,編譯器總是有足夠的信息來確定賦值右側的類型(如果有的話)。 您提出的語法不會提供該信息。
在您的第一個場景中,您聲明了一個空數組,因此您需要確定它是什么類型。
int[] num = new int[5]; // New empty array of integers with 5 slots.
但是,在第二個示例中,根據您為數組中的插槽分配的值隱含了數組的類型。
int[] num1 = new [] {1, 2, 3, 4}; // New array of integers with 4 slots, already assigned.
上面的工作原理是因為數組中的每個元素都是相同的類型。
如果您要執行以下操作,則會發生編譯錯誤,因為無法推斷類型,因為元素是不同的類型。
var array = new [] {1, "something"}; // This won't compile.
但是,如果將其中一個元素聲明為公共基類型,則它將所有元素存儲為該基類型。
var array = new [] {(object)1, "something", DateTime.Now}; // This is an array of objects.
當我用默認值聲明數組num時,為什么我必須在new之后編寫int
你沒有。 有許多可能的縮寫,因為編譯器通常可以推斷出您正在創建的數組的類型 ,就像您的情況一樣。
所以這是一個非常好的聲明:
var num1 = new[] { 1, 2, 3, 4 };
看,這里沒有int
,但如果你將鼠標懸停在var
它會告訴你數組是一個int[]
。
混合類型時越來越難:
var num1 = new [] { "1", 1 };
然后編譯器不知道並強制您指定類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.