如何避免此警告

warning CS8602: Dereference of a possibly null reference

代码:

public async Task<IEnumerable<T>> ExecuteQuery<T>(string commandText, string ctx, CancellationToken cancellationToken, CommandType commandType = CommandType.Text, object? paramSet = null)
{
    var dtsrc = CheckConnectionToDbServer(ctx, cancellationToken);
    //if (dtsrc == null) { _logger.LogTrace($"{methodName}: No datasource!"); return 0; }
    var con = dtsrc.OpenConnection();//<---? 
    IEnumerable<T> result2 = await con.QueryAsync<T>(commandText, paramSet, commandType: commandType).ConfigureAwait(false);
    return result2;
}

-- 如果dtsrc是空的,那么con也是空的,我不能从函数中返回Task<IEnumerable<T>>.如何修复它?

第二个函数:在没有连接的情况下如何返回NULL或类似的东西?

public async Task<T> ExecuteScalarQuery<T>(string commandText, string ctx, CancellationToken cancellationToken, CommandType commandType = CommandType.Text, object? paramSet = null)
{
    string methodName = nameof(ExecuteScalarQuery);
    _logger.LogTrace($"{methodName}: {ctx}");
    var dtsrc = CheckConnectionToDbServer(ctx, cancellationToken);

    if (dtsrc == null)
    {
        _logger.LogTrace($"{methodName}: No datasource!");
        //return // -<---???
    }
    var con = dtsrc.OpenConnection();
    return await con.QuerySingleAsync<T>(commandText, paramSet, commandType: commandType).ConfigureAwait(false);
}

推荐答案

对于您注释掉的部分,您走在了正确的道路上.只需返回一个空的可枚举数.

if (dtsrc == null) 
{ 
    _logger.LogTrace($"{methodName}: No datasource!"); 
    return Task.FromResult(Enumerable.Empty<T>());
}

或者,您也可以

引发异常 或 允许您的方法返回空值,并判断调用方法中的空值并在那里进行处理.

Csharp相关问答推荐

VB.Net的SON模式导致集合代码不工作

如何使用FastEndpoints和.NET 8 WebAppliationBuilder进行集成测试?

CsWin32如何创建PWSTR的实例,例如GetWindowText

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

在C#WinUI中,一个关于System的崩溃."由于未知原因导致执行不例外"

MudBlazor—MudDataGrid—默认过滤器定义不允许用户修改基本过滤器

如何在NodaTime中为Instant添加一年?

如何在没有额外副本的情况下将存储在IntPtr下的原始图像数据写入WinUI3中的Image控件?

为什么SignalR在每个Blazor服务器应用程序启动时最多启动8个服务器?

为什么Regex.IsMatch(";\\t";,";\\t";)返回FALSE而不是TRUE?

如何在ASP.NET Core8中启用REST应用程序的序列化?

持有者安全定义未显示在Swagger.NET 8中

UWP应用程序try 将打包的本机.exe文件加载为C#程序集

在IAsyncEnumerable上先调用,然后跳过(1)可以吗?

N层解决方案上的依赖注入-删除样板

如何管理Azure认证客户端响应和证书 fingerprint

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

如何使用ODP.NET C#设置Oracle会话时间长度限制

无法对包含字符串的列进行排序.请与实体框架联接

分别切换用于读取和写入的EF核心日志(log)