else {
provider = ci.NumberFormat;
}
- return ToType (value, conversionType, provider);
+ return ToType (value, conversionType, provider, true);
}
public static object ChangeType (object value, TypeCode typeCode)
else {
provider = ci.NumberFormat;
}
- return ToType (value, conversionType, provider);
+ return ToType (value, conversionType, provider, true);
}
public static object ChangeType (object value, Type conversionType, IFormatProvider provider)
{
if ((value != null) && (conversionType == null))
throw new ArgumentNullException ("conversionType");
- return ToType (value, conversionType, provider);
+ return ToType (value, conversionType, provider, true);
}
public static object ChangeType (object value, TypeCode typeCode, IFormatProvider provider)
{
Type conversionType = conversionTable [(int)typeCode];
- return ToType (value, conversionType, provider);
+ return ToType (value, conversionType, provider, true);
}
private static bool NotValidBase (int value)
// it as an object. In place for the core data types to use
// when implementing IConvertible. Uses hardcoded indexes in
// the conversionTypes array, so if modify carefully.
- internal static object ToType (object value, Type conversionType,
- IFormatProvider provider)
+
+ //
+ // The `try_target_to_type' boolean indicates if the code
+ // should try to call the IConvertible.ToType method if everything
+ // else fails.
+ //
+ // This should be true for invocations from Convert.cs, and
+ // false from the mscorlib types that implement IConvertible that
+ // all into this internal function.
+ //
+ // This was added to keep the fix for #481687 working and to avoid
+ // the regression that the simple fix introduced (485377)
+ internal static object ToType (object value, Type conversionType, IFormatProvider provider, bool try_target_to_type)
{
if (value == null) {
if ((conversionType != null) && conversionType.IsValueType){
else if (conversionType == conversionTable[18]) // 18 TypeCode.String
return (object) convertValue.ToString (provider);
else {
- return convertValue.ToType (conversionType, provider);
+ if (try_target_to_type)
+ return convertValue.ToType (conversionType, provider);
}
- } else
- // Not in the conversion table
- throw new InvalidCastException ((Locale.GetText (
- "Value is not a convertible object: " + value.GetType().ToString() + " to " + conversionType.FullName)));
+ }
+ // Not in the conversion table
+ throw new InvalidCastException ((Locale.GetText (
+ "Value is not a convertible object: " + value.GetType().ToString() + " to " + conversionType.FullName)));
}
}
}