'as' 是否可以用值类型代替?

Is there a replacement for 'as' with value types?

我完全知道为什么 as不能用于值类型。但是,我知道的唯一替代方法是:

if (!(obj is MyValueType)) { // Type check #1
  // Exception or whatnot
}

var myValueType = (MyValueType)obj; // Type check #2

但是,此代码会执行两次类型检查,这会产生性能成本,相同的成本 as 用于解决引用类型。

我的问题:值类型是否有更好的性能机制/语法?

我唯一能想到的单一类型检查机制是try/catch,但它当然有其自身的性能成本,我尽量避免基于异常的编程。

可以使用:

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 更加固定之前,这还不确定。