}
if ((expr_type != TypeManager.char_type) &&
- (expr_type != TypeManager.string_type))
+ (expr_type != TypeManager.string_type) &&
+ (expr_type != TypeManager.object_type))
return new NumericToBoolCast (expr, expr.Type);
}
if (e != null)
return e;
-
+
e = NarrowingConversion (ec, expr, target_type, loc);
if (e != null)
return e;
static public bool NarrowingConversionExists (EmitContext ec, Expression expr, Type target_type)
{
Type expr_type = expr.Type;
+ if (expr_type.IsSubclassOf (TypeManager.enum_type))
+ expr_type = TypeManager.EnumToUnderlying (expr_type);
+
+ if (target_type.IsSubclassOf (TypeManager.enum_type))
+ target_type = TypeManager.EnumToUnderlying (target_type);
+
+
+ if (expr_type == target_type)
+ return true;
if (target_type == TypeManager.sbyte_type){
//
{
Type expr_type = expr.Type;
+ if (expr_type.IsSubclassOf (TypeManager.enum_type))
+ expr_type = TypeManager.EnumToUnderlying (expr_type);
+
+ if (target_type.IsSubclassOf (TypeManager.enum_type))
+ target_type = TypeManager.EnumToUnderlying (target_type);
+
+ if (expr_type == target_type)
+ return expr;
+
if (target_type == TypeManager.sbyte_type){
//
// To sbyte from short, int, long, float, double.
// Ok, this *is* broken
e = RTConversionExpression(ec, "ByteType.FromObject", expr, loc);
break;
+ case TypeCode.Boolean:
+ switch (src_type) {
+ case TypeCode.String:
+ e = RTConversionExpression(ec, "BooleanType.FromString", expr, loc);
+ break;
+ case TypeCode.Object:
+ e = RTConversionExpression(ec, "BooleanType.FromObject", expr, loc);
+ break;
+ }
+ break;
case TypeCode.DateTime:
switch (src_type) {
case TypeCode.String:
Type target_type, Location loc)
{
Type expr_type = expr.Type;
+
+ if (expr_type.IsSubclassOf (TypeManager.enum_type))
+ expr_type = TypeManager.EnumToUnderlying (expr_type);
+
Expression e;
if (expr is NullLiteral) {
public class BoolToNumericCast : EmptyCast
{
- Expression src;
Type target_type;
OpCode conv;