我收到此错误(CS0161),为什么会收到此错误?

时间:2019-11-12 13:13:12

标签: c#

在这里编码新手。我正在练习C#以制作Caesar Cipher编码器。当我制作一种方法来加密邮件时,出现此错误。 (请参见下文)。

为什么会出现此错误?

我试图将方法返回类型更改为void。但是然后它说它不能将void类型转换为bool。我可以在这里帮忙吗?

using System;

namespace CaesarCipher
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine(Encrypt("hello"));
    }

    static string Encrypt(string message)
    {
      char[] alphabet = new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

      string secretMessage = message.ToLower();
      char[] secretMessageChar = secretMessage.ToCharArray();

      char[] encryptedMessage = new char[secretMessageChar.Length];

      for (int i = 0; i < secretMessage.Length; i++)
      {
        if (!Char.IsLetter(secretMessageChar[i]))
        {
          continue;
        }

        char letter = secretMessageChar[i];
        int caesarLetterIndex = (Array.IndexOf(alphabet, letter) + 3) % 26;

        char encryptedCharacter = alphabet[caesarLetterIndex];

        encryptedMessage[i] = encryptedCharacter;

        return String.Join("", encryptedMessage);
      }
    }
  }
}

我希望输出结果类似于“ khoor”,但是却这样说: Program.cs(12,19):错误CS0161:'Prog)':并非所有代码路径都返回一个值

3 个答案:

答案 0 :(得分:1)

好吧,在secretMessage的情况下,即清空当前实现,什么都不返回,因此您会遇到编译时错误。 将return String.Join("", encryptedMessage); 移出

static string Encrypt(string message)
{
  // Let's not hardcode
  char[] alphabet = Enumerable
    .Range('a', 'z' - 'a' + 1)
    .Select(c => (char) c)
    .ToArray();

  string secretMessage = message.ToLower();
  char[] secretMessageChar = secretMessage.ToCharArray();

  char[] encryptedMessage = new char[secretMessageChar.Length];

  for (int i = 0; i < secretMessage.Length; i++)
  {
    if (!Char.IsLetter(secretMessageChar[i]))
    {
      continue;
    }

    char letter = secretMessageChar[i];
    int caesarLetterIndex = (Array.IndexOf(alphabet, letter) + 3) % 26;

    char encryptedCharacter = alphabet[caesarLetterIndex];

    encryptedMessage[i] = encryptedCharacter;

    // We don't return here...  
  }

  // But we return there: wether or not we've encrypted anything 
  // we return encryptedMessage

  // Shorter version of string.Join("", ...)
  return String.Concat(encryptedMessage);
}

答案 1 :(得分:0)

如果secretMessage的长度为0,或者循环不返回任何内容,则需要在方法末尾在循环之外返回某些内容。

首先,您需要在开头检查是否为null或为空,因此ToLower不会引发异常。

接下来,您需要在循环末尾返回任何内容。

static string Encrypt(string message)
{
  if ( string.IsNullOrEmpty(message) )
    return message;
  ...
  return something or raise an exception.
}

答案 2 :(得分:0)

如果if语句不正确,则for语句总是在第一次迭代时返回某些内容。 @Oliver表示您应该在循环之外返回字符串或null