首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C#中的异步/等待返回可空值,即使被告知不返回空值?

为什么C#中的异步/等待返回可空值,即使被告知不返回空值?
EN

Stack Overflow用户
提问于 2020-08-25 11:51:52
回答 1查看 943关注 0票数 8

使用C#8,Visual 2019 16.7.2,给定以下C#代码:

代码语言:javascript
复制
#nullable enable

public async Task<string> GetStringAsync(); ...

public async void Main()
{
    var theString = await GetStringAsync();
    ...
}

theString上悬停的智能感知显示了局部变量(string?)的工具提示。theString

我的GetStringAsync方法从不返回可空字符串,但变量被推断为可空。

这是一个智能感知错误吗?或者,由于theString的某些工作方式,await实际上可能为null,这是否存在更深层次的问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-25 15:23:55

这是设计出来的,与await无关.

var总是可以空的,来自规格

var为引用类型推断带注释的类型。例如,在var s = "";中,var被推断为string?

因此,在使用theString时,不能显式地将var指定为非空。如果希望它是不可空的,请显式地使用string

至于原因:简而言之,它允许这样的场景:

代码语言:javascript
复制
#nullable enable

public async Task<string> GetStringAsync(); ...

public async void Main()
{
    var theString = await GetStringAsync();
    
    if (someCondition)
    {
        // If var inferred "string" instead of "string?" the following line would cause
        // warning CS8600: Converting null literal or possible null value to non-nullable type.
        theString = null;
    }
}

编译器将使用流分析来确定变量在任何给定点上是否为null。你可以在这里读到更多关于这个决定的内容。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63578257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档