C#中能否比较方法返回值与变量值?方法内调用方法比较疑问
问题原因
你的校验逻辑失败和「方法内部调用其他方法做值比较」的写法没有关系,核心是两个硬错误:
- 类型不匹配:
Card()方法中定义的password变量是int类型,而Pin()方法的返回值是string类型,C#中这两种类型直接用==比较永远不会得到相等结果,编译阶段就会抛出类型不匹配异常。 - 输入逻辑重复冲突:
Card()方法里先调用了Console.ReadLine()等待用户输入一整行内容并回车,执行完这行才会进入Pin()方法的逐位按键读取逻辑,相当于要求用户连续输两次密码,两次输入的内容分别存在两个变量里,根本不可能完成同一次输入的校验。
另外你的Pin()方法还有个交互小问题:用Console.WriteLine('*')输出掩码会导致每输入一位数字就换一行,不符合常规密码输入的交互习惯。
修复方式
- 删掉多余的
Console.ReadLine()输入逻辑,密码输入统一走Pin()方法,全程用字符串类型存密码,不要转成int——转int会丢失密码开头的0,比如正确密码是0012转成int会变成12,直接导致合法密码校验失败。 - 把
Pin()里输出掩码的Console.WriteLine改成Console.Write,避免逐位换行,有需要可以加退格删除的逻辑,优化输入体验。
修复后的完整参考代码:
// 预存正确密码,用字符串类型保留前导零 private const string RealPassword = "1234"; public static string Pin(int size = 4) { StringBuilder sb = new StringBuilder(size); while (sb.Length < size) { var key = Console.ReadKey(true); if (key.KeyChar >= '0' && key.KeyChar <= '9') { sb.Append(key.KeyChar); Console.Write('*'); } // 支持退格删除已输入内容 else if (key.Key == ConsoleKey.Backspace && sb.Length > 0) { sb.Remove(sb.Length - 1, 1); Console.Write("\b \b"); } } Console.WriteLine(); return sb.ToString(); } static void Card() { Console.WriteLine("Enter the 4 Digits Password"); string inputPwd = Pin(); if (inputPwd == RealPassword) { // 此处写校验通过后的业务逻辑 } }
内容的提问来源于stack exchange,提问作者João Silva
相关产品推荐
相关产品推荐

