using System;
using System.Linq;
using SLE = System.Linq.Expressions;
-
-#if NET_4_0 || MOBILE_DYNAMIC
using System.Dynamic;
-#endif
namespace Mono.CSharp
{
this.loc = loc;
}
- public override TypeSpec ResolveAsType (IMemberContext ec)
+ public override TypeSpec ResolveAsType (IMemberContext ec, bool allowUnboundTypeArguments)
{
eclass = ExprClass.Type;
type = ec.Module.Compiler.BuiltinTypes.Dynamic;
//
public class RuntimeValueExpression : Expression, IDynamicAssign, IMemoryLocation
{
-#if !NET_4_0 && !MOBILE_DYNAMIC
- public class DynamicMetaObject
- {
- public TypeSpec RuntimeType;
- public TypeSpec LimitType;
- public SLE.Expression Expression;
- }
-#endif
readonly DynamicMetaObject obj;
return base.MakeExpression (ctx);
#else
-#if NET_4_0 || MOBILE_DYNAMIC
if (type.IsStruct && !obj.Expression.Type.IsValueType)
return SLE.Expression.Unbox (obj.Expression, type.GetMetaInfo ());
if (((SLE.ParameterExpression) obj.Expression).IsByRef)
return obj.Expression;
}
- #endif
return SLE.Expression.Convert (obj.Expression, type.GetMetaInfo ());
#endif
return this;
}
-#if NET_4_0 || MOBILE_DYNAMIC
public override SLE.Expression MakeExpression (BuilderContext ctx)
{
#if STATIC
return SLE.Expression.Block (expr.MakeExpression (ctx), SLE.Expression.Default (type.GetMetaInfo ()));
#endif
}
-#endif
}
#endregion
protected bool DoResolveCore (ResolveContext rc)
{
+ foreach (var arg in arguments) {
+ if (arg.Type == InternalType.VarOutType) {
+ // Should be special error message about dynamic dispatch
+ rc.Report.Error (8047, arg.Expr.Location, "Declaration expression cannot be used in this context");
+ }
+ }
+
if (rc.CurrentTypeParameters != null && rc.CurrentTypeParameters[0].IsMethodTypeParameter)
context_mvars = rc.CurrentTypeParameters;
}
}
- Expression target = new DelegateInvocation (new MemberAccess (site_field_expr, "Target", loc).Resolve (bc), args, loc).Resolve (bc);
+ Expression target = new DelegateInvocation (new MemberAccess (site_field_expr, "Target", loc).Resolve (bc), args, false, loc).Resolve (bc);
if (target != null)
target.Emit (ec);
}
if (member != null && member.HasTypeArguments) {
TypeArguments ta = member.TypeArguments;
- if (ta.Resolve (ec)) {
+ if (ta.Resolve (ec, false)) {
var targs = new ArrayInitializer (ta.Count, loc);
foreach (TypeSpec t in ta.Arguments)
targs.Add (new TypeOf (t, loc));