我完全了解为什么 as
不能用于值类型。但是,我所知道的唯一替代品是:
if (!(obj is MyValueType)) { // Type check #1
// Exception or whatnot
}
var myValueType = (MyValueType)obj; // Type check #2
但是,此代码执行两次类型检查,这会产生性能成本,同样的成本as
来解决参考类型。
我的问题:对于值类型,是否有更好的性能机制/语法?
我能想到的唯一单一类型检查机制是try/catch
,但这当然具有自己的性能成本,我尽量避免基于异常的编程。
答案 0 :(得分:5)
你可以使用:
var maybeValueType = obj as MyValueType?;
if (maybeValueType != null)
{
// Use maybeValueType.Value
}
然而,这performs worse than is
+ casting - 或至少在过去。
C#7可能会解决这个问题:
if (obj is MyValueType value)
{
// Use value here
}
......但很明显,直到C#7更加固定,它还不确定。