是否有价值类型的'as'替代品?

tse*_*mer -1 c# casting value-type

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

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

var myValueType = (MyValueType)obj; // Type check #2
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*eet 5

可以使用:

var maybeValueType = obj as MyValueType?;
if (maybeValueType != null)
{
    // Use maybeValueType.Value
}
Run Code Online (Sandbox Code Playgroud)

然而,这种执行更糟is+铸造 -或者至少已经过去.

C#7可能会解决这个问题:

if (obj is MyValueType value)
{
    // Use value here
}
Run Code Online (Sandbox Code Playgroud)

......但很明显,直到C#7被钉住,这还不确定.