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# 代码。

谢谢。

4

2 回答 2

8

这个语法:

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

是一个隐式类型的数组初始值设定项。数组的类型是从大括号内的元素推断出来的。例如,上面完全等价于:

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

在你的情况下,它会是new SelectItem[] { ... }.

C# 3 中引入了隐式类型数组(但即使面向 .NET 2.0,您也可以使用它们;它们只是 C# 编译器功能)。它们部分是为了支持使用匿名类型,但它们在其他情况下也很有用。

但是,在代码中的每个元素中,您都有一个对象初始化器,这是一种在单个表达式中创建对象和设置属性(或添加到集合)的方法。所以这:

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#”的规则比这要复杂一些(为了更有用)。

于 2013-07-31T16:38:57.267 回答
6

1)new[] {}创建项目数组,其中类型是从项目推断出来的,在这种情况下,它是一个SelectListItem.

2) 是的

于 2013-07-31T16:29:03.300 回答