代码之家  ›  专栏  ›  技术社区  ›  Matheus Dias de Souza

通过nullable原谅null时收到警告。值类型上的值属性

  •  0
  • Matheus Dias de Souza  · 技术社区  · 2 年前

    我试图复制应用于值类型的空原谅代码,但它不会生成任何警告: dotnetfiddle.net .在实际代码中,我收到了一个警告。我实际上是在用编译。NET内核6.0。

    我在一个代码库中得到了多个编译时警告,其中一些警告与空原谅代码有关。我试着用其中一种 SomeNullableValue.Value SomeNullableValue! ,但编译器抱怨我可能及格了 null 以两种方式将参数转换为函数。

    我现在处理的案子是一个 enum 最初为空,但稍后在同一控制流中分配;在这种情况下,是这样的 Ast.ContStmtTarget? t 哪里 Ast.ContStmtTarget 枚举 :

    NextToken();
    Ast.ContStmtTarget? t = null;
    if (CurrentToken.Type == Token.Keyword) {
        switch (CurrentToken.StringValue) {
            case "do": t = Ast.ContStmtTarget.Do; break;
            case "for": t = Ast.ContStmtTarget.For; break;
            case "loop": t = Ast.ContStmtTarget.Loop; break;
            case "while": t = Ast.ContStmtTarget.While; break;
        }
    }
    if (!t.HasValue) {
        FatalError(0x80A0400, GetTokenSpan());
    }
    r = new Ast.ContStmt(t.Value);
    

    r = ...; ,列指向 t.Value .此外 Ast.ContStmt 构造函数接受一个不可为空的值( 枚举 ).

    ...\Parser.cs(1410,38): warning CS8629: Nullable value type may be null.
    

    我已经把可编译项目放到GitHub上了( dotnet build ):

    2 回复  |  直到 2 年前
        1
  •  2
  •   pm100    2 年前

    编译器警告您,可以使用t==null到达该行。法塔莱罗回来了吗?我想它会抛出,但编译器不知道

    if (!t.HasValue) {
        FatalError(0x80A0400, GetTokenSpan());
    } else{
       r = new Ast.ContStmt(t.Value);
    }
    
        2
  •  1
  •   Guru Stron    2 年前

    你可以标记 FatalError 具有 DoesNotReturnAttribute 帮助编译器在 if 是不可及的,以防万一 !t.HasValue 否则,它无法验证它实际上不会被调用:

    [DoesNotReturn]
    private void FatalError(int msgId, Span? span, Dictionary<string, object>? vars = null) {
        throw new SyntaxException(Program.Collect(new Problem(msgId, false, vars, span.Value)));
    }