更新了我的 .NET Core 3.1 控制台应用程序以使用 Nullables 功能并具有以下内容foreach
loop.
DataTable profiles = DB.ListProfiles();
// CS8600 warning here
// v
foreach (DataRow r in profiles.Rows)
{
// processing code here
}
static public DataTable ListProfiles()
{
DataTable t = new DataTable();
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT * FROM [Table]";
using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
sda.Fill(t);
}
}
return t;
}
在这个例子中,r
有编译器警告。
将 null 文字或可能的 null 值转换为不可为 null 的类型。
我知道需要检查空值等。我的问题是,有谁知道如何使用这个新功能让编译器意识到两者都不是profiles
nor profiles.Rows
会永远为空吗?这t
变量在ListProfiles
绝对不能返回任何结果,但这不会使Rows
空,会吗?
如果我使用空合并运算符??
像这样:profiles.Rows ?? ...
警告将会消失,但我无法弄清楚在它真正起作用之后可以做什么。
我也尝试过使用!运算符来自如何抑制可能的空引用警告 https://stackoverflow.com/questions/61384377/how-to-suppress-possible-null-reference-warnings/61388468#61388468但这没有效果。警告仍然存在。虽然这适用于其他类型,但似乎不适用于DataRowCollection
.
我尝试过各种放置方式null
检查,但只有显式的代码内抑制似乎才有效。
可为空的值为r
, not profiles
or profiles.Rows
,由编译器正确识别。只需将其声明为可为空,然后在循环中处理空检查:
foreach (DataRow? r in profiles.Rows)
{
if(r == null)
continue;
// ...
}
原因是DataRowCollection
(这是类型Rows
数据表上的属性)是非泛型可枚举的。这就是使用 .NET 1.0 API 所获得的结果。
编译器将非泛型枚举项视为类型object?
, not object
(或者更准确地说,IEnumerator.Current
is an object?
),因为集合中的任何此类项目都可能为 null,并且没有泛型将这些项目限制为不可为 null 值。
由于指定了 a 的类型foreach
变量只是为您插入一个转换,最终结果是您需要将变量本身声明为可为空,因为您无法安全地将可为空值转换为不可为空值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)