if (MemberType.IsStatic)
Error_VariableOfStaticClass (Location, GetSignatureForError (), MemberType, Report);
- CheckBase ();
+ if (!IsCompilerGenerated)
+ CheckBase ();
+
IsTypePermitted ();
}
if (TypeSpec.IsReferenceType (MemberType))
return true;
- if (MemberType.IsEnum)
+ if (MemberType.IsPointer)
return true;
+ if (MemberType.IsEnum) {
+ switch (EnumSpec.GetUnderlyingType (MemberType).BuiltinType) {
+ case BuiltinTypeSpec.Type.SByte:
+ case BuiltinTypeSpec.Type.Byte:
+ case BuiltinTypeSpec.Type.Short:
+ case BuiltinTypeSpec.Type.UShort:
+ case BuiltinTypeSpec.Type.Int:
+ case BuiltinTypeSpec.Type.UInt:
+ return true;
+ default:
+ return false;
+ }
+ }
+
return false;
}
return true;
}
}
+
+ class PrimaryConstructorField : Field
+ {
+ //
+ // Proxy resolved parameter type expression to avoid type double resolve
+ // and problems with correct resolve context on partial classes
+ //
+ sealed class TypeExpressionFromParameter : TypeExpr
+ {
+ Parameter parameter;
+
+ public TypeExpressionFromParameter (Parameter parameter)
+ {
+ this.parameter = parameter;
+ eclass = ExprClass.Type;
+ loc = parameter.Location;
+ }
+
+ public override TypeSpec ResolveAsType (IMemberContext mc, bool allowUnboundTypeArguments)
+ {
+ return parameter.Type;
+ }
+ }
+
+ public PrimaryConstructorField (TypeDefinition parent, Parameter parameter)
+ : base (parent, new TypeExpressionFromParameter (parameter), Modifiers.PRIVATE, new MemberName (parameter.Name, parameter.Location), null)
+ {
+ caching_flags |= Flags.IsUsed | Flags.IsAssigned;
+ }
+
+ public override string GetSignatureForError ()
+ {
+ return MemberName.Name;
+ }
+ }
}