C#中的switch-case和out参数

时间:2017-11-21 05:09:05

标签: c# switch-statement

string returnString;
switch(Type) {
    case 0: returnString = exampleFunction(foo0, out int exitCode); break;
    case 1: returnString = exampleFunction(foo1, out int exitCode); break;
    case 2: returnString = exampleFunction(foo2, out int exitCode); break;
}

当我编写这段代码时,VS向我显示了一个错误:'在这个范围内已经为第4行和第5行定义了一个名为'exitCode'的本地变量或名为'exitCode'的函数。所以如果我想得到两个以上的变量来自exampleFunction的不同类型,我该怎么办?如果我无法在代码中使用out,我是否应该使用元组从函数中获取returnStringexitCode

3 个答案:

答案 0 :(得分:8)

您可以在exitCode之前声明switch变量。您应该使用某个值对其进行初始化,或者在default中使用switch分支。否则,exitCode之后会有switch未初始化的流程。编译器不会通过这个。另外,请不要忘记每个break后的case

int exitCode = 0;
string returnString;

switch(Type) {
    case 0: returnString = exampleFunction(foo0, out exitCode); break;
    case 1: returnString = exampleFunction(foo1, out exitCode); break;
    case 2: returnString = exampleFunction(foo2, out exitCode); break;
}

但是整体上有一个方法返回两个不同的值(一个作为返回值,第二个作为out参数)是一个不好的做法。考虑使用一些简单的类将这些值作为属性:

class SomeValue
{
    public string Foo { get; set; }

    public int Code { get; set; }
}

static SomeValue ExampleFunction(string input)
{
    return new SomeValue
    {
        Foo = input,
        Code = 1,
    };
}

static void Main(string[] args)
{
    // ...

    SomeValue val = null;
    switch (Type)
    {
        case 0: val = ExampleFunction(foo0); break;
        case 1: val = ExampleFunction(foo1); break;
        case 2: val = ExampleFunction(foo2); break;
    }
}

答案 1 :(得分:0)

您可以考虑使用数组,而不是声明foo0foo1foo2foo[]。每当你看到带有这样的升序数字的变量名时,这通常是一个好主意。

如果你这样做,问题就会消失,你的代码很多更短:

var returnString = exampleFunction(foo[Type], out int exitCode);

如果在foo0foo1foo2的问题域中没有意义生活在一个数组中(例如,他们的个人姓名很重要),你仍然可以使用临时数组作为地图:

var returnString = exampleFunction(
    new[] {foo0, foo1, foo2} [Type], 
    out int exitCode
);

答案 2 :(得分:0)

您应该首次声明“exitCode”

.on()

一旦声明它为“inline”,它就成为该块的局部变量。