示例#1
0
        internal static void EmitConvertToType(this ILGenerator il, Type typeFrom, Type typeTo, bool isChecked)
        {
            if (TypeHelper.AreEquivalent(typeFrom, typeTo))
            {
                return;
            }

            if (typeFrom == typeof(void) || typeTo == typeof(void))
            {
                throw ContractUtils.Unreachable;
            }

            bool isTypeFromNullable = TypeHelper.IsNullableType(typeFrom);
            bool isTypeToNullable   = TypeHelper.IsNullableType(typeTo);

            Type nnExprType = TypeHelper.GetNonNullableType(typeFrom);
            Type nnType     = TypeHelper.GetNonNullableType(typeTo);

            if (typeFrom.IsInterface ||       // interface cast
                typeTo.IsInterface ||
                typeFrom == typeof(object) || // boxing cast
                typeTo == typeof(object) ||
                typeFrom == typeof(System.Enum) ||
                typeFrom == typeof(System.ValueType) ||
                TypeHelper.IsLegalExplicitVariantDelegateConversion(typeFrom, typeTo))
            {
                il.EmitCastToType(typeFrom, typeTo);
            }
            else if (isTypeFromNullable || isTypeToNullable)
            {
                il.EmitNullableConversion(typeFrom, typeTo, isChecked);
            }
            else if (!(TypeHelper.IsConvertible(typeFrom) && TypeHelper.IsConvertible(typeTo)) // primitive runtime conversion
                     &&
                     (nnExprType.IsAssignableFrom(nnType) ||                                   // down cast
                      nnType.IsAssignableFrom(nnExprType)))                                    // up cast
            {
                il.EmitCastToType(typeFrom, typeTo);
            }
            else if (typeFrom.IsArray && typeTo.IsArray)
            {
                // See DevDiv Bugs #94657.
                il.EmitCastToType(typeFrom, typeTo);
            }
            else
            {
                il.EmitNumericConversion(typeFrom, typeTo, isChecked);
            }
        }
示例#2
0
 public bool IsEquivalent(IFunArray array) => TypeHelper.AreEquivalent(this, array);