protected virtual bool DoDefine (TypeContainer parent) { if (Name == null) Name = "this"; if (!parent.MethodModifiersValid (ModFlags, Name, Location)) return false; flags = Modifiers.MethodAttr (ModFlags); // Lookup Type, verify validity MemberType = parent.ResolveType (Type, false, Location); if (MemberType == null) return false; if ((parent.ModFlags & Modifiers.SEALED) != 0){ if ((ModFlags & (Modifiers.VIRTUAL|Modifiers.ABSTRACT)) != 0){ Report.Error (549, Location, "Virtual method can not be contained in sealed class"); return false; } } // verify accessibility if (!parent.AsAccessible (MemberType, ModFlags)) { if (this is Property) Report.Error (53, Location, "Inconsistent accessibility: property type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than property `" + Name + "'"); else if (this is Indexer) Report.Error (54, Location, "Inconsistent accessibility: indexer return type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than indexer `" + Name + "'"); else if (this is Method) Report.Error (50, Location, "Inconsistent accessibility: return type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than method `" + Name + "'"); else Report.Error (52, Location, "Inconsistent accessibility: field type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than field `" + Name + "'"); return false; } if (MemberType.IsPointer && !UnsafeOK (parent)) return false; // // Check for explicit interface implementation // if ((ExplicitInterfaceName == null) && (Name.IndexOf (".") != -1)){ int pos = Name.LastIndexOf ("."); ExplicitInterfaceName = Name.Substring (0, pos); ShortName = Name.Substring (pos + 1); } else ShortName = Name; if (ExplicitInterfaceName != null) { InterfaceType = RootContext.LookupType ( parent, ExplicitInterfaceName, false, Location); if (InterfaceType == null) return false; // Compute the full name that we need to export. Name = InterfaceType.FullName + "." + ShortName; if (!parent.VerifyImplements (InterfaceType, ShortName, Name, Location)) return false; IsExplicitImpl = true; } else IsExplicitImpl = false; return true; }