我正试图掌握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#代码。
感谢。
答案 0 :(得分:8)
此语法:
new[] { "foo", "bar", "baz" }
是隐式类型化数据初始值设定项。数组的类型是从大括号内的元素推断出来的。例如,上面的完全等同于:
new String[] { "foo", "bar", "baz" }
在您的情况下,它将是new SelectItem[] { ... }
。
Implicitly typed arrays(但即使面向.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#”的规则比这更复杂(为了更有用)。
答案 1 :(得分:6)
1)new[] {}
创建项目数组,其中类型是从项目推断出来的,在这种情况下,它是SelectListItem
的数组。
2)是的