C# switch 表达式 null 大小写

C# switch expressions null case

我做了一些研究,但还没有找到答案。在 c# 8 switch 表达式中是否有一种表示 null 情况的方式,使得编译器在调用 ToString() 时能够识别并且不会触发基本情况下引用 x 的警告?这似乎是一个明显的案例,在这种情况下我不需要使用 null 宽容运算符 !

public override int? ConvertToInt(object? value) => value switch
{
    var x when x == null => null,
    int x => x,
    var x => int.Parse(x!.ToString())
};

我觉得他们还没有做到这一点,但我想我应该把问题抛在那里。

编辑:

我确实想出了一种方法来消除对 null 宽容运算符的需要,但我仍然很好奇是否存在可识别的特定 null case 语法。这感觉不是最好的方法,因为它还不完全清楚,而且我什至不确定这是否会得到尊重,因为我认为 Nullable 引用实际上不会在 运行 时间影响任何东西,我会测试这个很快。

public override int? ConvertToInt(object? value) => value switch
{    
    int x => x,
    // notice the non-nullable object
    object x => int.Parse(x.ToString()),
    _ => null
};

编辑 2:

看来我看错了,这好像是荣幸啊。 运行进行以下测试时断言没有失败。

[TestMethod]

public void MyTestMethod()
{
    object? could_be_null = null;
    string? str = could_be_null switch
    {
        object x => x.ToString(),
        _ => null
    };

    Assert.IsNull(str);
}

经过原始问题编辑中显示的一些实验后,我想出了这个解决方案。令我惊讶的是,在 运行 时间检查了类型化引用的可空性。这是我能想到的最好的,如果有人能想出更好的东西,或者有我不知道的 null 情况的官方语法,我很乐意接受你的回答。

public override int? ConvertToInt(object? value) => value switch
{    
    int x => x,
    // notice the non-nullable object
    object x => int.Parse(x.ToString()),
    _ => null
};

前段时间我也思考过这个问题。具体来说,围绕是否使用三元运算符或新的 switch 表达式 which respects and checks the nullability of reference types at runtime.

例子,你更喜欢哪个,切换表达式:

private void SetProductCategoryHierarchyFromParentNode() => ProductCategoryHierarchy =
        ParentNode switch {
            ProductCategoryHierarchyNode node => node.ProductCategoryHierarchy,
            _ => ProductCategoryHierarchy.Default,
        };
};

或三元运算符:

private void SetProductCategoryHierarchyFromParentNode() => ProductCategoryHierarchy =
        ParentNode is not null
        ? ParentNode.ProductCategoryHierarchy
        : ProductCategoryHierarchy.Default;

我会选择它们中的任何一个,但需要注意的是,使用 switch 表达式,稍后可以通过模式匹配轻松引入结构验证。例如:

private void SetProductCategoryHierarchyFromParentNode() => ProductCategoryHierarchy =
        ParentNode switch {
            { HierarchyLevel: > 10 } => throw new Exception("Product category hierarchies deeper than 10 levels are strictly prohibited."),
            ProductCategoryHierarchyNode node => node.ProductCategoryHierarchy,
            _ => ProductCategoryHierarchy.Default,
        };