【问题标题】:Why do null string parameters in a constructor not throw an exception?为什么构造函数中的空字符串参数不会引发异常?
【发布时间】: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 - “这些警告是在编译时发出的。编译器不会在其中添加任何空检查或其他运行时构造一个可为空的上下文。在运行时,一个可为空的引用和一个不可为空的引用是等价的。" 确保包含实际编译器错误(或警告,可能被视为错误)。
  • 查看这篇关于&lt;WarningsAsErrors&gt; 的帖子,这可能会帮助您了解这个编译时间。注意:如果您从另一个项目引用 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


【解决方案1】:

可空引用类型仅用于编译时静态分析,如docs 状态:

可空引用类型不是新的类类型,而是对现有引用类型的注释。编译器使用这些注释来帮助您在代码中找到潜在的空引用错误。 不可空引用类型和可空引用类型在运行时没有区别。编译器不会为不可为空的引用类型添加任何运行时检查。好处在于编译时分析。编译器会生成警告,帮助您查找和修复代码中潜在的空错误。您声明您的意图,当您的代码违反该意图时,编译器会向您发出警告。

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多