【问题标题】:I am receiving this error (CS0161), why am I getting it? [duplicate]我收到此错误 (CS0161),为什么会收到此错误? [复制]
【发布时间】:2019-11-12 13:13:12
【问题描述】:

在这里编码新手。我正在练习我的 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): error CS0161: 'Prog)': 并非所有代码路径都返回值

【问题讨论】:

标签: c#


【解决方案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);
}

【讨论】:

    【解决方案2】:

    如果 secretMessage 的长度为 0,则需要在方法结束时返回循环外的内容,否则循环不返回任何内容。

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

    接下来你需要在最后也返回一些东西,以防循环什么都不返回。

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

    【讨论】:

    • 不完全是,if (string.IsNullOrEmpty(message)) return message 还不够:反例 message = "123" - 它不会被加密,Char.IsLetter 将返回 false,它会调用 @依次为 987654326@,因此永远无法到达 return String.Join("", encryptedMessage);
    【解决方案3】:

    如果 if 语句不正确,您的 for 语句总是会在您的第一次迭代中返回一些内容。在@Oliver 所说的循环之外,您应该返回一个字符串或 null

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 2016-01-01
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多