此字典可以接受任何类型的对象,但会抛出CS8600在将输出赋值为命名变量时将空文字或可能的空值转换为非空类型,然后在使用"value"时取消对可能为空的引用的引用以后。
Dictionary<string, object> objects = new();
if(objects.TryGetValue("IntObjectName", out object value))
{
var intValue = (int)value;
}
if(objects.TryGetValue("StringObjectName", out object value))
{
var stringValue = (string)value;
}
怎么写才不会抛出可空引用警告呢?
此模式用于接收各种不同类型的参数字典。集合需要接受任何类型的对象,但是实现服务将知道如何处理特定的名称和对象。(账户、客户等)
我希望有一种方法来指示对象不为空,而不是抑制空警告或只是使用可空对象。参数必须具有要添加到集合中的值(非null)。
我使用它来构建一个linq查询表达式树,其中传递了一组参数值,每个方法检查是否需要它的表达式,这取决于哪些字段有输入。每个方法都负责转换和清理用户输入,并实现相关的逻辑。
private static IQueryable<CutInFlatWorkflowJob> WhereBillAccountKey(Dictionary<string, object> parameters, IQueryable<CutInFlatWorkflowJob> query)
{
if (!parameters.TryGetValue("BillAccountKey", out object value)) return query;
var clean = value.ToString().Replace("-", string.Empty);
if (int.TryParse(clean, out int account))
{
return query.Where(x => x.Workflow.Source.BillAccountKey == account);
}
else
{
return query.Where(x => 0 == 1);
}
}
假设项目设置为<Nullable>enable</Nullable>
,将out
变量声明为可空,例如,不是object
,而是object?
。本质上,你是在声明该值可能为空,因此没有警告。您也可以使用var
,例如out var value
。
Dictionary<string, object> objects = new()
{
{ "IntObjectName", null },
{ "StringObjectName", null }
};
if (objects.TryGetValue("IntObjectName", out object? value0) && null != value0)
{
var intValue = (int)value0;
}
if (objects.TryGetValue("StringObjectName", out object? value1) && null != value1)
{
var stringValue = (string)value1;
}
示例代码中的字典值实际上是null
。虽然不会有编译器警告,但null的强制转换将是一个运行时异常。
在。net 6中引入了可空分析/检查的变化。参见可空引用类型。