在Razor代码中导致“未分配的局部变量”的原因是什么?

时间:2012-03-13 22:36:31

标签: c# razor syntax-error

我在使用一些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'。

我在这里做错了什么,如何解决?

1 个答案:

答案 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>,因为它通常更适合代码更改。 (特别是当用作方法签名的一部分时。)

快乐的编码。