C# Cast优化与GCHandle

C# Cast优化与GCHandle,c#,casting,C#,Casting,我有一个对象,它仅通过隐式转换运算符提供对内部字节[]的访问。大概是这样的: class Thing { private byte[] array; public static implicit operator byte[](Thing thing) => thing.array; } 我需要固定该阵列以作为IntPtr传递: void Foo(Thing thing) { byte[] array = thing; // cast to access inn

我有一个对象,它仅通过隐式转换运算符提供对内部字节[]的访问。大概是这样的:

class Thing
{
    private byte[] array;
    public static implicit operator byte[](Thing thing) => thing.array;
}
我需要固定该阵列以作为IntPtr传递:

void Foo(Thing thing)
{
    byte[] array = thing;  // cast to access inner byte[]
    var handle = GCHandle.Alloc(array, GCHandleType.Pinned);
    DoSomethingWithArray(GCHandle.ToIntPtr(handle));
    handle.Free();
}

似乎编译器有可能(在某些情况下我没有遇到)优化掉强制转换,这将导致错误的对象被固定。是吗?

您正在传递一个引用,因此不可能锁定错误的对象。行
byte[]数组=thing
将像写入的那样执行
字节[]数组=运算符(thing)。看起来您正在返回对最内层数组的引用。这就是会被钉住的东西


编辑:它不会被优化的原因是因为它不再是演员阵容了;当你像那样编写自己的操作符时,这是一个函数调用。函数本身可能是内联的,但行为不会简单地消失。

这似乎是不可能的,因为强制转换是程序运行所必需的。是什么让你这么想,优化的结果会是什么?我想我只是有点偏执。是否
DoSomethingWithArray
IntPtr
返回后仍保留对它的引用?@RonBeyer不,它没有。我认为可能的原因是因为GCHandle.Alloc接受一个对象参数,所以两者都(对象)一个(字节[])事物产生和对象。编译器可能会感到满意?