我在使用一些Razor C#代码语法时遇到了一些问题。
我有一个表单,其行为为“website.cshtml”。 website.cshtml应该传入所有传入的数据,并在
标签中打印出来。
这就是我所拥有的:
@{
string names = Request.Form["name"];
string [] arrOfnames; // string array to hold names
if (names != null) { // if the name isn't null, split into the array
arrOfNames = names.Split(',');
}
foreach(string name in names)
{
<p>name</p>
}
}
这会导致错误
使用未分配的局部变量'arrOfNames'。
我在这里做错了什么,如何解决?
答案 0 :(得分:4)
当有机会在分配之前从读取本地变量时,会产生C#编译器错误。 (我假设代码是真的 for (var name in arrOfNames)
- 提示! - 或稍后访问arrOfNames
。)
必须在所有可能的代码路径上分配它(arrOfNames
)(由编译器确定)。
如果names == null
怎么办?那么arrOfNames
会是什么? C#确保您明确 。
一种方法是确保在“备用路径”中分配值:
string[] arrOfnames;
if (names != null) {
arrOfNames = names.Split(','); // assigned here
} else {
arrOfNames = new string[0]; // -or- here
}
但
string[] arrOfnames = null; // assign default. see below.
if (names != null) {
arrOfNames = names.Split(',');
}
或
IEnumerable<string> arrOfNames = names != null
? names.Split(',')
: null; // "alternate path", but single expression. see below.
或
var arrOfNames = (names ?? "").Split(',');
也可以。
我建议使用“空集合”与null
,因为空的可枚举对象仍然可以迭代,如下几行所示。另一方面,或许应该死于丑陋的可怕死亡......
另外,请考虑使用接口IEnumerable<string>
,因为它通常更适合代码更改。 (特别是当用作方法签名的一部分时。)
快乐的编码。