强制转换为可为null的类型是个坏主意

本文关键字:类型 转换 null | 更新日期: 2023-09-27 18:29:35

我一直认为应该不惜一切代价避免铸造。当然,有时您没有真正的选择(尤其是当您需要在支持多个接口的接口类型之间转换时)。

我最近经常使用的一种模式是从不可为null的类型转换为可为null类型。例如:

public int? GetFooBar(someCriteria) {
    // Code to get a Foo
    return foo == null ? null : (int?)foo.Bar; // Bar is a non-null int
}

他们把我唯一的选择选在这里了吗?我还有什么其他选择?

我想我可以抛出一个异常,但我不喜欢用不必要的异常处理程序来破坏我的代码。此外,找不到foo可能是意料之中的事情,而不被视为"异常"。

强制转换为可为null的类型是个坏主意

您可以始终:

if(foo == null)
    return null;
return foo.Bar;

不涉及选角,而且以简洁为代价,稍微清晰一点。

让我指出

return foo == null ? null : (int?)foo.Bar;

编译为与相同的操作码

return foo == null ? new Nullable<int>() : new Nullable<int>(foo.Bar);

带有if语句的版本也可能编译为相同的操作码,所以这实际上只是个人品味的问题。这个版本怎么样:

return foo == null ? (int?)null : foo.Bar;

同样的事情。如果要使用条件运算符,则必须指出其第二个或第三个操作数中可为null的部分。