令人困惑的切换/案例结果

时间:2018-09-23 18:45:17

标签: c# switch-statement

当然,在发布此错误之前,我搜索了一下。下面的代码返回:错误CS0029:无法在两个地方隐式将类型'bool'转换为'string'。我是否误解了为什么下面的代码没有返回字符串?我自己想了些什么,Stack Overflow可能会给我什么建议,我尽了最大的努力明确地将其强制转换为字符串,但仅使自己感到困惑。

public static class Bob
{
    public static string Response(string statement)
    {
        string teststring = statement;

        bool IsAllUpper(string input)
        {
            for (int i = 0; i < input.Length; i++)
            {
                if (Char.IsLetter(input[i]) && !Char.IsUpper(input[i]))
                    return false;
            }
            return true;
        }

        switch(teststring)
        {
        case IsAllUpper(teststring) && teststring.EndsWith("?"):
            string final1 = "Calm down, I know what I'm doing!";
            return final1;   

        case teststring.EndsWith("?"):
            string final2 = "Sure";
            return final2;

        default:
            string final3 = "Whatever.";
            return final3;
        }
    }

    public static void Main()
    {
        string input = "This is the end";
        Console.WriteLine("{0}", Response(input));
    }
}

1 个答案:

答案 0 :(得分:5)

使用switch(teststring)时,您要求代码打开 string 值,例如“ foo”和“ bar”。但是,您的case boolean 值:IsAllUpper(teststring)teststring.EndsWith("?")都返回布尔值。

考虑用if语句替换switch块,例如

if (IsAllUpper(teststring) && teststring.EndsWith("?")) {
    string final1 = "Calm down, I know what I'm doing!";
    return final1;
}   

if (teststring.EndsWith("?")) {
    string final2 = "Sure";
    return final2;
}

string final3 = "Whatever.";
return final3;

或者,对于最大的简洁性含糊不清,单线:

return teststring.EndsWith("?") ? (IsAllUpper(teststring) ? "Calm down, I know what I'm doing!" : "Sure") : "Whatever."