C#中的switch-case和out参数

cyl*_*lee 0 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;
}
Run Code Online (Sandbox Code Playgroud)

当我编写这段代码时,VS向我显示了一个错误:'名为'exitCode'的局部变量已在此范围内为第4行和第5行定义.因此,如果我想获得两个以上不同类型的变量exampleFunction, 我该怎么办?如果我不能out在代码中使用,我应该使用元组来获取returnStringexitCode从函数中获取吗?

Cod*_*ler 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;
}
Run Code Online (Sandbox Code Playgroud)

但总体而言,有一个方法返回两个不同的值(一个作为返回值,第二个作为输出参数)是一种不好的做法.考虑使用一些简单的类将这些值作为属性:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)