You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中能否实现非可空引用类型的类型推断?

问题:如何通过类型推断创建非可空引用类型?

我将大型项目升级到.NET Core和C# 12后,原本很期待可空引用类型的特性,但很快发现一个问题:通过var进行类型推断创建的变量会被标记为可空类型,这让空值检查失去了意义——而我大量代码都依赖类型推断。

举个例子,有这样的API:

Task<List<My.Very.Long.Namespace.Chain.Item>> GetSomeDataThatIsNeverNull(int id);

用var data = await GetSomeDataThatIsNeverNull(123);写法很简洁,但data会被推断为可空类型;如果要让data成为非可空类型,不得不写成:

List<My.Very.Long.Namespace.Chain.Item> data = await GetSomeDataThatIsNeverNull(123);

这就非常繁琐。

我理解这种设计的考量:主要是为后续可能给变量赋值null的场景留余地,但这属于特殊情况。大多数时候,我获取对象后只会直接使用,不会将其设为null;如果确实需要给变量赋值null,我会在特定场景单独处理,或是创建新变量。

那么有没有办法无需写出完整类型名,就能通过类型推断创建正确的非可空引用类型?


补充说明

有评论要求提供代码示例:

string Foo() => "foo";
var foo = Foo();

Foo()方法声明返回非可空的string,且实际始终返回非空字符串,但foo的推断类型却是string?:
变量foo被推断为string?的截图

对于string这类短类型,显式声明和用var差别不大,但对于List<My.Very.Long.Namespace.Chain.Item>这类长类型,显式声明就太麻烦了。


内容的提问来源于stack exchange,提问作者Joshua Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:03:10