diff --git a/src/EFCore/ChangeTracking/ValueComparer.cs b/src/EFCore/ChangeTracking/ValueComparer.cs index 269f9675b2c..db5115422a5 100644 --- a/src/EFCore/ChangeTracking/ValueComparer.cs +++ b/src/EFCore/ChangeTracking/ValueComparer.cs @@ -9,6 +9,7 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Query; using Microsoft.EntityFrameworkCore.Utilities; +using CA = System.Diagnostics.CodeAnalysis; namespace Microsoft.EntityFrameworkCore.ChangeTracking { @@ -103,6 +104,7 @@ protected ValueComparer( /// /// The instance. /// The snapshot. + [return: CA.NotNullIfNotNull("instance")] public abstract object? Snapshot([CanBeNull] object? instance); /// diff --git a/src/EFCore/ChangeTracking/ValueComparer`.cs b/src/EFCore/ChangeTracking/ValueComparer`.cs index edb9b304c9f..f3d25276cd7 100644 --- a/src/EFCore/ChangeTracking/ValueComparer`.cs +++ b/src/EFCore/ChangeTracking/ValueComparer`.cs @@ -9,6 +9,7 @@ using System.Reflection; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore.Internal; +using CA = System.Diagnostics.CodeAnalysis; namespace Microsoft.EntityFrameworkCore.ChangeTracking { @@ -31,7 +32,7 @@ public class ValueComparer : ValueComparer, IEqualityComparer { private Func? _equals; private Func? _hashCode; - private Func? _snapshot; + private Func? _snapshot; /// /// Creates a new with a default comparison @@ -80,7 +81,7 @@ public ValueComparer( public ValueComparer( [NotNull] Expression> equalsExpression, [NotNull] Expression> hashCodeExpression, - [NotNull] Expression> snapshotExpression) + [NotNull] Expression> snapshotExpression) : base(equalsExpression, hashCodeExpression, snapshotExpression) { } @@ -159,7 +160,7 @@ public ValueComparer( /// Creates an expression for creating a snapshot of a value. /// /// The snapshot expression. - protected static Expression> CreateDefaultSnapshotExpression(bool favorStructuralComparisons) + protected static Expression> CreateDefaultSnapshotExpression(bool favorStructuralComparisons) { if (!favorStructuralComparisons || !typeof(T).IsArray) @@ -176,7 +177,7 @@ public ValueComparer( // var destination = new T[length]; // Array.Copy(source, destination, length); // return destination; - return Expression.Lambda>( + return Expression.Lambda>( Expression.Block( new[] { lengthVariable, destinationVariable }, Expression.Assign( @@ -243,20 +244,21 @@ var expression /// The second instance. /// if they are equal; otherwise. public override bool Equals(object? left, object? right) - { - var v1Null = left == null; - var v2Null = right == null; - - return v1Null || v2Null ? v1Null && v2Null : Equals((T?)left, (T?)right); - } + => (left, right) switch + { + (null, null) => true, + (null, _) => false, + (_, null) => false, + _ => Equals((T)left, (T)right) + }; /// /// Returns the hash code for the given instance. /// /// The instance. /// The hash code. - public override int GetHashCode(object? instance) - => instance == null ? 0 : GetHashCode((T)instance); + public override int GetHashCode(object instance) + => GetHashCode((T)instance); /// /// Compares the two instances to determine if they are equal. @@ -291,7 +293,7 @@ public virtual int GetHashCode(T instance) /// The instance. /// The snapshot. public override object? Snapshot(object? instance) - => instance == null ? null : (object?)Snapshot((T?)instance); + => instance == null ? null : (object?)Snapshot((T)instance); /// /// @@ -306,7 +308,7 @@ public virtual int GetHashCode(T instance) /// /// The instance. /// The snapshot. - public virtual T? Snapshot([CanBeNull] T? instance) + public virtual T Snapshot([NotNull] T instance) => NonCapturingLazyInitializer.EnsureInitialized( ref _snapshot, this, static c => c.SnapshotExpression.Compile())(instance); @@ -339,7 +341,7 @@ public override Type Type /// reference. /// /// - public new virtual Expression> SnapshotExpression - => (Expression>)base.SnapshotExpression; + public new virtual Expression> SnapshotExpression + => (Expression>)base.SnapshotExpression; } }