Index: src/booc/App.cs =================================================================== --- src/booc/App.cs (revision 1446) +++ src/booc/App.cs (working copy) @@ -292,6 +292,12 @@ break; } + case "ducky": + { + _options.DuckByDefault = true; + break; + } + default: { InvalidOption(arg); Index: src/Boo.Lang.Compiler/TypeSystem/BooCodeBuilder.cs =================================================================== --- src/Boo.Lang.Compiler/TypeSystem/BooCodeBuilder.cs (revision 1446) +++ src/Boo.Lang.Compiler/TypeSystem/BooCodeBuilder.cs (working copy) @@ -626,7 +626,7 @@ } else { - parameter.Type = CreateTypeReference(_tss.ObjectType); + parameter.Type = CreateTypeReference(_tss.DefaultType); } } parameter.Entity = new InternalParameter(parameter, i + delta); Index: src/Boo.Lang.Compiler/TypeSystem/TypeSystemServices.cs =================================================================== --- src/Boo.Lang.Compiler/TypeSystem/TypeSystemServices.cs (revision 1446) +++ src/Boo.Lang.Compiler/TypeSystem/TypeSystemServices.cs (working copy) @@ -135,6 +135,8 @@ CompilerContext _context; + public IType DefaultType; + public TypeSystemServices() : this(new CompilerContext()) { } @@ -189,9 +191,11 @@ Cache(IntPtrType = new ExternalType(this, Types.IntPtr)); Cache(MulticastDelegateType = new ExternalType(this, Types.MulticastDelegate)); Cache(DelegateType = new ExternalType(this, Types.Delegate)); + + DefaultType = (Context.Parameters.DuckByDefault) ? DuckType : ObjectType; ObjectArrayType = GetArrayType(ObjectType); - + PreparePrimitives(); } @@ -225,12 +229,11 @@ return ICallableType; } - IType obj = ObjectType; if (current.IsClass && candidate.IsClass) { - if (current == obj || candidate == obj) + if (current == DefaultType || candidate == DefaultType) { - return obj; + return DefaultType; } if (current.GetTypeDepth() < candidate.GetTypeDepth()) { @@ -238,7 +241,7 @@ } return GetMostGenericType(current, candidate.BaseType); } - return obj; + return DefaultType; } public IType GetPromotedNumberType(IType left, IType right) @@ -408,7 +411,7 @@ } } } - return ObjectType; + return DefaultType; } public IType GetExpressionType(Expression node) Index: src/Boo.Lang.Compiler/CompilerParameters.cs =================================================================== --- src/Boo.Lang.Compiler/CompilerParameters.cs (revision 1446) +++ src/Boo.Lang.Compiler/CompilerParameters.cs (working copy) @@ -56,6 +56,8 @@ bool _debug; + bool _duckByDefault; + public readonly TraceSwitch TraceSwitch = new TraceSwitch("booc", "boo compiler"); public CompilerParameters() @@ -211,5 +213,18 @@ _debug = value; } } + + public bool DuckByDefault + { + get + { + return _duckByDefault; + } + + set + { + _duckByDefault = value; + } + } } }