Entschärfung: MemberDescriptor.Equals

Beginnend mit Apps für .NET Framework 4.6.2 hat sich die Implementierung der MemberDescriptor.Equals-Methode geändert. Da die Methoden System.ComponentModel.EventDescriptor.Equals und System.ComponentModel.PropertyDescriptor.Equals die Basisklassenimplementierung erben, wirkt sich die Änderung auch auf diese Methoden aus.

In Apps, die auf ältere Versionen von .NET Framework als .NET Framework 4.6.2 ausgerichtet sind, hat ein Teil der Prüfung auf Gleichheit durch die MemberDescriptor.Equals-Methode fälschlicherweise die MemberDescriptor.Category-Eigenschaft eines Objekts mit der MemberDescriptor.Description-Eigenschaft eines anderen verglichen. Beginnend mit Apps für .NET Framework 4.6.2 vergleicht die MemberDescriptor.Equals-Methode die MemberDescriptor.Description-Eigenschaft von zwei Objekten.

Auswirkungen

Diese Änderung implementiert den Test auf Gleichheit für System.ComponentModel.MemberDescriptor-Objekte ordnungsgemäß und sollte nur minimale Auswirkungen haben.

Problemumgehung

Es stehen zwei Problemumgehungen zur Verfügung, wenn Ihre App für .NET Framework 4.6.2 oder eine spätere Version von .NET-Framework vorgesehen ist und von der MemberDescriptor.Equals-Methode abhängt, die manchmal false zurückgibt, wenn die Memberdeskriptoren gleichwertig sind:

  • Sie können sich gegen diese Änderung entscheiden, ohne Ihren Quellcode zu ändern, indem Sie Folgendes zum Abschnitt <runtime> Ihrer app.config-Datei hinzufügen:

    <runtime>  
        <AppContextSwitchOverrides value = "Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=true" />  
     </runtime>  
    
  • Sie können Ihren Quellcode ändern, um das vorherige Verhalten wiederherzustellen, indem Sie die Eigenschaften MemberDescriptor.Category und MemberDescriptor.Description nach dem Aufrufen der MemberDescriptor.Equals-Methode manuell vergleichen, wie es im folgenden Codefragment geschieht.

    if (memberDescriptor1.Equals(memberDescriptor2) &   
        memberDescriptor1.Description.Equals(memberDescriptor2.Category)) {  
          // Code to execute if true.  
    }  
    else {  
          // Code to execute if false.     
    }  
    
    If memberDescriptor1.Equals(memberDescriptor2) And   
        memberDescriptor1.Description.Equals(memberDescriptor2.Category)  
          // Code to execute if True.  
    Else  
          // Code to execute if False.     
    End If  
    

Für Apps mit .NET Framework 4.6.1 und früheren Versionen als Zielplattform können Sie diese Änderung aktivieren, indem Sie Ihrer app.config-Datei den folgenden Wert hinzufügen:

<runtime>  
    <AppContextSwitchOverrides value="Switch.System.MemberDescriptorEqualsReturnsFalseIfEquivalent=true />  
</runtime>  

Siehe auch

Neuausrichtungsänderungen
Anwendungskompatibilität in 4.6.2