示例#1
0
        internal static Conversion Classify(TypeSymbol sourceType, TypeSymbol targetType, ParameterDirection direction)
        {
            if (sourceType.Equals(targetType))
                return Identity;

            // First, make sure we have a conversion from argument to parameter.
            switch (direction)
            {
                case ParameterDirection.In:
                    if (!sourceType.HasImplicitConversionTo(targetType))
                        return sourceType.HasExplicitConversionTo(targetType) ? Explicit : None;
                    break;
                case ParameterDirection.Out:
                    if (!targetType.HasImplicitConversionTo(sourceType))
                        return None;
                    break;
                case ParameterDirection.Inout:
                    if (!sourceType.HasImplicitConversionTo(targetType) || !targetType.HasImplicitConversionTo(sourceType))
                        return None;
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            var conversionType = ConversionTypes.None;

            var numericTargetType = targetType as IntrinsicNumericTypeSymbol;
            var numericSourceType = sourceType as IntrinsicNumericTypeSymbol;
            if (numericTargetType != null && numericSourceType != null)
            {
                conversionType |= ClassifyTypeConversion(numericSourceType, numericTargetType);
                conversionType |= ClassifyDimensionConversion(numericSourceType, numericTargetType);
            }

            // TODO: Non-numeric implicit conversions.

            return new Conversion(true, false, false, conversionType);
        }
示例#2
0
        internal static bool HasExplicitConversionTo(this TypeSymbol left, TypeSymbol right)
        {
            if (left.Equals(right))
            {
                return(true);
            }

            if (left.IsIntrinsicNumericType() && right.Kind == SymbolKind.Struct)
            {
                return(true);
            }

            return(left.HasImplicitConversionTo(right));
        }