并非所有代码路径都返回值#2

时间:2016-11-02 11:36:15

标签: c# switch-statement boolean

我希望将bool containsVowel返回到我的main方法中,如果一个单词包含一个元音,它将允许它存储到一个数组中。当我使用下面的代码时,方法名称出现错误,说"并非所有代码路径都返回值"。我也试过不使用for循环,以及char数组 - 它工作得很好但是如果我在表单中输入元音它仍然说没有找到元音。

private bool vowel(string word)
{
    bool containsVowel = false;

    char[] wordChar = word.ToCharArray();

    for (int i = 0; i < word.Length; i++)
    {
        switch (wordChar[i])
        {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                return containsVowel = true;
                break;

            default:
                MessageBox.Show("Word must contain a vowel", "Error");
                return containsVowel = false;
                break;
        }
    }
}

5 个答案:

答案 0 :(得分:1)

鉴于您的方法的返回类型为bool而不是void,所有代码路径都必须返回一个值。 C#编译器试图非常天真地评估所有代码路径,以查看您的方法是否从所有路径返回值。

您的方法对编译器来说是这样的:

start
  for
    switch
      case
        return
      default
        return
end

由于switchdefault可以正常覆盖,但for也是一个条件分支。如果您传递一个空字符串,则不会输入fori = 0word.Length = 0,因此i < word.Length从一开始就为假,所以 for之后,还需要一个return语句。

您可以通过执行以下操作来大规模改进代码:

public bool ContainsVowel(string word)
{
    if (string.IsNullOrEmpty(word))
    {
        return false;
    }

    var upperCaseCharacters = word.ToUpper().ToCharArray();

    foreach (var character in upperCaseCharacters)
    {
        switch (character)
        {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                return true;
        }
    }

    return false;
}

此代码检查传递的字符串是null还是空,然后立即返回false(快速失败)。然后它将字符串转换为大写一次,并使用foreach()在字符数组上循环,这是迭代遍历集合的首选方法。然后它不会使用中间变量来存储结果,因为只要遇到元音就可以返回true

最后,当迭代所有字符后没有遇到元音时,该方法返回false。

然后在呼叫站点,您可以这样做:

if (!ContainsVowel(word))
{
    MessageBox.Show("Word must contain a vowel", "Error");
}

因为这样的方法不应该包含消息框之类的UI逻辑。

答案 1 :(得分:0)

您的代码只检查了字符串的第一个字符,因为如果它是元音,它会跳出循环。这应该解决它,但为了更好的方法,请检查@ Sr82的答案

private bool vowel(string word)
{
    bool containsVowel = false;

    char[] wordChar = word.ToCharArray();

    for (int i = 0; i < word.Length; i++)
    {
        switch (wordChar[i])
        {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                return containsVowel = true;
            //if you find a vowel, you can return true straight away
        }
    }
    //if you dont find one, let the for loop finish. If it reaches this code you know
    //there was no vowel found and you can proceed with your error report
    MessageBox.Show("Word must contain a vowel", "Error");
    return containsVowel = false;
}

答案 2 :(得分:0)

这段代码应该这样做。首先,检查一个空字值。然后你必须将你的单词转换为高位,以便检测所有元音,就是这个上面或下面。然后,你必须只检查一个元音,因为如果存在元音,该方法应该返回true。如果,在检查所有字母后,该方法没有检测到元音,显示错误消息并返回false:

private static bool vowel(string word)
{
    if (word == null) return false;
    char[] wordChar = word.ToUpper().ToCharArray();

    for (int i = 0; i < word.Length; i++)
    {
        switch (word[i])
        {
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                return true;
                break;
        }
    }
    Console.WriteLine("Word must contain a vowel");
    return false;
}

如您所见,此方法始终返回一个值。在你的代码中,如果传递的单词为空,它将不会进入for循环,因此它不会返回任何内容。

答案 3 :(得分:0)

如果您正在尝试检查字符串是否包含元音,那就可以这样做:

private bool vowel(string word)
{   
    return word.ToLower().Any(x => "aeiou".Contains(x));
}

这使用LINQ,特别是Any method来确定字符串是否包含任何元音。最好将字符串设置为全部小写,以便您可以检查元音是否存在,无论是否存在。

答案 4 :(得分:0)

如果您可以使用Linq,这个简单的方法应该可行。 Intersect方法采用两个char序列,并返回两个都存在的char序列。如果序列中有任何内容,Any方法将返回true。

using System.Linq;

void Main()
{
    string s = "Word";
    if (hasVowels(s))
    {
        Console.WriteLine("Word has vowels");
    }
    else
    {
        Console.WriteLine("Word does not have vowels");
    }
}

//The `Intersect` method takes two `char` sequences and returns a sequence
//of `char` that exists in both of them.  The `Any` method returns true if
//there is anything in the resulting sequence.
private bool hasVowels(string word)
{
    string vowels = "AEIOUaeiou";
    return word != null && word.Intersect(vowels).Any();
}