C#中能否根据布尔参数判定方法返回值的可空性?
问题解答
该效果可以实现,示例代码无法编译的核心原因是NotNullWhen特性的用法错误。
错误原因
NotNullWhen特性仅支持传入1个布尔类型构造参数,设计用途是标记:当方法自身返回值等于传入的布尔值时,被该特性标记的out/ref参数不为null,最典型的应用是TryParse模式的方法。它无法直接关联普通输入参数与方法返回值的null依赖关系,因此传入两个参数、绑定noRowsThrows参数名的写法不符合特性使用规则。
推荐实现
目前兼容性最好、可100%通过C#静态null检查的方案是拆分语义明确的方法,代替布尔参数控制返回逻辑,同时采纳SingleOrDefault()的优化建议,避免不必要的内存分配:
/// <summary> /// 执行查询,无匹配行时抛出异常,返回值一定不为null /// </summary> public DataRow ExecuteToDataRow(SqlCommand command) { DataTable dataTable = ExecuteToDataTable(command); DataRow? result = dataTable.Rows.Cast<DataRow>().SingleOrDefault(); if (result is null) throw new ArgumentException("The command did not return any rows!"); return result; } /// <summary> /// 执行查询,无匹配行时返回null /// </summary> public DataRow? ExecuteToDataRowOrDefault(SqlCommand command) { DataTable dataTable = ExecuteToDataTable(command); return dataTable.Rows.Cast<DataRow>().SingleOrDefault(); }
该设计和.NET内置LINQ方法逻辑一致:
Single()无匹配时抛异常、返回值确定非空,SingleOrDefault()无匹配时返回null,调用时不需要额外记忆布尔参数的含义,代码可读性更高。
如果必须保留单方法+布尔参数的写法,当前C#静态null分析暂不支持通过特性直接精准识别该场景下的返回值null状态,可以在调用点根据传入的布尔值,使用!null原谅运算符手动提示编译器即可。
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

