public override DifferenceType Diff(IDifferences differences, ITypeDefinitionMember impl, ITypeDefinitionMember contract) { if (impl == null || contract == null) { return(DifferenceType.Unknown); } // If implementation is public then contract can be any visibility if (impl.Visibility == TypeMemberVisibility.Public) { return(DifferenceType.Unknown); } // If implementation is protected or protected internal then contract must be protected or protected internal as well. if (impl.Visibility == TypeMemberVisibility.Family || impl.Visibility == TypeMemberVisibility.FamilyOrAssembly) { if (contract.Visibility != TypeMemberVisibility.Family && contract.Visibility != TypeMemberVisibility.FamilyOrAssembly) { differences.AddIncompatibleDifference(this, $"Visibility of member '{impl.FullName()}' is '{impl.GetVisibilityName()}' in the {Implementation} but '{contract.GetVisibilityName()}' in the {Contract}."); return(DifferenceType.Changed); } } return(DifferenceType.Unknown); }