internal IntPtr InvokeObjectArrayDelegate(object[] arguments)
        {
            if (!_conversionInfo.IsObjectArrayDelegateThunk)
            {
                Environment.FailFast("Thunk is not an object array delegate thunk!");
            }

            Debug.Assert(!_delegateData.Equals(default(DelegateData)));

            Func <object[], object> targetDelegate = _delegateData._helperObject as Func <object[], object>;

            Debug.Assert(targetDelegate != null);

            object result = targetDelegate(arguments ?? Array.Empty <object>());

            TypeHandle thArgType;
            bool       forceByRefUnused;

            _calleeArgs.GetReturnType(out thArgType, out forceByRefUnused);
            Debug.Assert(!thArgType.IsNull());

            unsafe
            {
                if (thArgType.IsValueType() && thArgType.GetRuntimeTypeHandle().ToEETypePtr()->IsNullable)
                {
                    object nullableObj = RuntimeAugments.RawNewObject(thArgType.GetRuntimeTypeHandle());
                    s_pinnedGCHandles._returnObjectHandle.Target = nullableObj;
                    if (result != null)
                    {
                        RuntimeAugments.StoreValueTypeField(ref RuntimeAugments.GetRawData(nullableObj), result, thArgType.GetRuntimeTypeHandle());
                    }
                }
                else
                {
                    s_pinnedGCHandles._returnObjectHandle.Target = result;
                }
            }

            return(s_pinnedGCHandles._returnObjectHandle.GetRawTargetAddress());
        }