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