【发布时间】:2020-10-21 20:48:48
【问题描述】:
当我启用空引用类型时,我已经查看但无法弄清楚为什么我在构造函数中为字符串参数传递空值时没有收到异常。
构造函数参数不被视为不可为空吗?
这是我的构造函数:
public ApiClient( string baseUrl, string authorizationToken ) {
string testString = null;
_apiClientBaseUrl = baseUrl ?? throw new ArgumentNullException( $"{nameof(baseUrl)} cannot be null" );
_authorizationToken = authorizationToken ?? throw new ArgumentNullException( $"{nameof(authorizationToken)} cannot be null" );
}
我确实收到了string testString = null; 行的错误。
如果我删除编码的空测试,我可以为 2 个属性传递空值并且不会收到任何错误。该对象将很好地实例化。
我在一个 .NET Core 3.1 项目中,这个项目在 .csproj 文件中:
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<Nullable>enable</Nullable>
<WarningsAsErrors>CS8600;CS8602;CS8603;CS8625</WarningsAsErrors>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
【问题讨论】:
-
这样不行:docs.microsoft.com/en-us/dotnet/csharp/nullable-references - “这些警告是在编译时发出的。编译器不会在其中添加任何空检查或其他运行时构造一个可为空的上下文。在运行时,一个可为空的引用和一个不可为空的引用是等价的。" 确保包含实际编译器错误(或警告,可能被视为错误)。
-
查看这篇关于
<WarningsAsErrors>的帖子,这可能会帮助您了解这个编译时间。注意:如果您从另一个项目引用 DLL,仍然无法正常工作,遗憾的是...stackoverflow.com/questions/58194983/… -
运行这段代码,我得到了调用
new ApiClient(null, null)时抛出的预期错误。 -
@Abion47 您错过了 OP 问题中的“如果我删除编码的空测试,我可以为 2 个属性传递空值并且不会出现任何错误”部分。我最初也是这样做的=)
-
@ user2864740 - 感谢您的信息,但我确实收到“字符串 testString = null;”的编译时错误线。代码不会使用“TreatWarningsAsErrors”选项编译。我将这些行添加到该构造函数中: TestMethod( null );测试方法(测试字符串);测试方法(baseUrl);这个方法: private void TestMethod( string testString ) { string x = testString;前 2 行我得到红色的 sugglies,但第三行没有。
标签: c# .net-core nullable-reference-types