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?:
对于string这类短类型,显式声明和用var差别不大,但对于List<My.Very.Long.Namespace.Chain.Item>这类长类型,显式声明就太麻烦了。
内容的提问来源于stack exchange,提问作者Joshua Frank
相关产品推荐
相关产品推荐

