无法验证输入是否匹配数组内用户名及CS8600错误求助
解决CS8600错误与用户ID验证代码逻辑问题
1. CS8600错误的原因与解决
在.NET 6及以上版本中,默认启用了nullable引用类型检查。Console.ReadLine()方法在输入流结束(比如用户按Ctrl+Z)时会返回null,但你将其赋值给了非可空的string InputID,编译器判定此处存在将null转换为非可空类型的风险,因此抛出CS8600错误。
错误修复方案:
- 声明可空字符串:将
InputID类型改为string?,使用前先判断是否为null:string? InputID = Console.ReadLine(); if (InputID == null) { Console.WriteLine("输入不能为空"); return; } - 设置输入默认值:用空合并运算符将null转为空字符串:
string InputID = Console.ReadLine() ?? "";
2. 原代码的逻辑问题
你的代码仅检查了数组第一个元素,存在两处关键问题:
- 若输入不等于第一个元素,仅给
checkid加1后程序直接结束,不会继续检查后续元素,导致大部分匹配情况无法被识别 if-else if-else结构中,InputID != Userid[checkid]与InputID == Userid[checkid]完全互斥,else分支永远不会被触发
修正后的代码示例
写法1:循环遍历数组
int checkid = 0; string[] Userid = {"John","Bob","Dennis"}; Console.WriteLine("What is your User ID : "); // 处理输入null情况 string? InputID = Console.ReadLine(); if (InputID == null) { Console.WriteLine("输入不能为空"); return; } bool isMatch = false; // 遍历数组检查所有用户名 while (checkid < Userid.Length) { if (InputID == Userid[checkid]) { isMatch = true; break; } checkid++; } // 根据匹配结果输出 if (isMatch) { Console.WriteLine($"Hi! {InputID}"); } else { Console.WriteLine("Error"); }
写法2:用LINQ的Contains方法(更简洁)
string[] Userid = {"John","Bob","Dennis"}; Console.WriteLine("What is your User ID : "); string? InputID = Console.ReadLine(); if (InputID == null) { Console.WriteLine("输入不能为空"); return; } if (Userid.Contains(InputID)) { Console.WriteLine($"Hi! {InputID}"); } else { Console.WriteLine("Error"); }
内容的提问来源于stack exchange,提问作者GothenBurger
相关产品推荐
相关产品推荐

