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,
};
我做了一些研究,但还没有找到答案。在 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,
};