protected override bool LLEquals(TypeSpec obj, bool partialNameMatch) { ClosureTypeSpec spec = obj as ClosureTypeSpec; if (spec == null) { return(false); } if (partialNameMatch) { if (Arguments == null && spec.Arguments == null && ReturnType == null && spec.ReturnType == null) { return(true); } if (Arguments == null || spec.Arguments == null) { return(false); } if (ReturnType == null || spec.ReturnType == null) { return(false); } return(Arguments.EqualsPartialMatch(spec.Arguments) && ReturnType.EqualsPartialMatch(spec.ReturnType)); } else { var specArgs = spec.Arguments is TupleTypeSpec ? spec.Arguments : new TupleTypeSpec(spec.Arguments); var thisArgs = Arguments is TupleTypeSpec ? Arguments : new TupleTypeSpec(Arguments); return(BothNullOrEqual(thisArgs, specArgs) && BothNullOrEqual(ReturnType, spec.ReturnType)); } }