2013-07-31 28 views
2

我試圖去與ASP MVC4夾具和我遇到這樣的@ {...}內的.cshtml文件中傳來:這是什麼新的[] {}

 @Html.DropDownListFor(x => x.WillAttend, new[] { 
      new SelectListItem() { 
       Text = "Yes, I'll be there", 
       Value = bool.TrueString}, 
      new SelectListItem() { 
       Text = "No, I can't come", 
       Value = bool.FalseString} 
     }, "Choose an option") 

Q1)什麼樣的事情是這樣的:new[]{...}

Q2)我說的是,對於剃刀,大括號內的東西只是任何C#代碼。

謝謝。

+3

這是一個內聯數組聲明:) –

+2

@retailcoder - 不,它不是。 – Oded

+1

如果您有兩個問題,請發佈兩個問題。 –

回答

8

此語法:

new[] { "foo", "bar", "baz" } 

隱型數組初始化。數組的類型是從大括號內的元素推斷出來的。例如,上面是正是等同於:

new String[] { "foo", "bar", "baz" } 

在你的情況,這將是new SelectItem[] { ... }。在C#3中引入了(但即使在面向.NET 2.0時也可以使用它們;它們只是C#編譯器功能)。他們部分支持使用anonymous types,但它們在其他情況下也很有用。

但是,在代碼中的每個元素中,都有一個object initializer,這是一種在單個表達式中創建對象並設置屬性(或添加到集合)的方法。所以這個:

new SelectListItem() { 
    Text = "No, I can't come", 
    Value = bool.FalseString 
} 

等同於:

SelectListItem tmp = new SelectListItem(); 
tmp.Text = "No, I can't come"; 
tmp.Value = bool.FalseString; 

...除了它是一個單一的表達,這就是爲什麼你能數組初始化程序中使用它。在C#3中引入了對象初始值設定項。

對於Razor問題 - 我認爲是這樣,但我認爲有關何時將一段文本推斷爲「普通C#」的規則比這更復雜一些(以便更有用)。

6

1)new[] {}創建項目數組,其中類型從項目中推斷,在這種情況下,它是一個數組SelectListItem

2)是