private bool IsFixedEqual(SchemaDeclBase baseDecl, SchemaDeclBase derivedDecl) {
if (baseDecl.Presence == SchemaDeclBase.Use.Fixed || baseDecl.Presence == SchemaDeclBase.Use.RequiredFixed) {
object baseFixedValue = baseDecl.DefaultValueTyped;
object derivedFixedValue = derivedDecl.DefaultValueTyped;
Debug.Assert(baseFixedValue != null);
if (derivedDecl.Presence != SchemaDeclBase.Use.Fixed && derivedDecl.Presence != SchemaDeclBase.Use.RequiredFixed) {
return false;
}
Debug.Assert(derivedFixedValue != null);
XmlSchemaDatatype baseDatatype = baseDecl.Datatype;
XmlSchemaDatatype derivedDatatype = derivedDecl.Datatype;
if (baseDatatype.Variety == XmlSchemaDatatypeVariety.Union) {
if (derivedDatatype.Variety == XmlSchemaDatatypeVariety.Union) {
if ( !derivedDatatype.IsEqual(baseFixedValue, derivedFixedValue) ) {
return false;
}
}
else { //Base is union and derived is member of union
XsdSimpleValue simpleFixedValue = baseDecl.DefaultValueTyped as XsdSimpleValue;
Debug.Assert(simpleFixedValue != null);
XmlSchemaDatatype memberType = simpleFixedValue.XmlType.Datatype;
if (!memberType.IsComparable(derivedDatatype) || !derivedDatatype.IsEqual(simpleFixedValue.TypedValue, derivedFixedValue)) { //base type {Union of long & string}, derived type {int}
return false;
}
}
}
else if (!derivedDatatype.IsEqual(baseFixedValue, derivedFixedValue)) {
return false;
}
}
return true;
}
};