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); }