使用ReadLine()方法时出现CS8600错误的技术咨询
嘿,这个问题我之前也踩过坑!其实是C#的nullable引用类型特性在起作用,我给你拆解下原因和解决办法:
为什么会出这个错误?
从C# 8.0开始,默认开启了nullable引用类型的编译检查。Console.ReadLine()的返回值是string?(即可为空的字符串)——比如控制台输入流被强制关闭时,它就会返回null。但你代码里的string input是非可空的引用类型,编译器不允许你把一个可能为null的值直接赋值给它,所以就抛出了CS8600这个错误。
几种解决方法,按需选就行:
方法一:用可空字符串接收(最安全推荐)
直接把变量类型改成string?,明确告诉编译器这个变量允许为null,后续还能针对性处理null场景:namespace Something{ class UserInputEg{ static void Main(string[] args){ string? input = Console.ReadLine(); // 加个判断避免后续空引用问题 if (input != null) { Console.WriteLine(input); } else { Console.WriteLine("没有输入任何内容哦"); } Console.Read(); } } }方法二:用null包容运算符压制警告
如果你百分百确定这个场景下用户一定会输入内容(比如必填交互),可以用!运算符告诉编译器“我保证这个值不会是null”:string input = Console.ReadLine()!; Console.WriteLine(input);注意:这个方法要谨慎用!如果实际运行中真出现null,会直接抛出
NullReferenceException,只在你完全确定不会有null的场景用。方法三:给个默认值兜底
用空合并运算符??设置一个默认值,就算返回null,变量也会被赋值为你指定的内容:string input = Console.ReadLine() ?? "用户未输入内容"; Console.WriteLine(input);适合不想处理null逻辑,直接要一个兜底值的情况。
方法四:关闭nullable特性(不推荐)
如果你暂时不想用这个编译检查,可以在代码顶部加#nullable disable指令,或者修改项目文件的配置:#nullable disable namespace Something{ class UserInputEg{ static void Main(string[] args){ string input = Console.ReadLine(); Console.WriteLine(input); Console.Read(); } } }不过真不推荐这么做——nullable特性是帮你提前发现潜在空引用问题的,关闭它等于放弃了这个编译时的安全检查。
内容的提问来源于stack exchange,提问作者Ritwik Nandi

