Как запись 9.0 реализует равенство на основе значений для свойств объектов (например, массивов)?

#c# #c#-9.0

#c# #c #-9.0

Вопрос:

Как запись 9.0 реализует равенство на основе значений для свойств объектов (например, массивов)?

Я заметил, что два объекта записи одного и того же типа, имеющие свойство timestamp, представляющее собой массив байтов, не распознаются как равные, несмотря на то, что все байты одинаковы.

Пример:

 public record C 
{
   public byte[] Timestamp {get; set;}
}
 

https://sharplab.io/#v2:EYLgtghgzgLgpgJwDQBMQGoA BYAUAAQGYACBOAYwHsEViBhYgbz2NeKOOAE94BtAXWIAVAJZg4sCGAAOTAOZwYAbmJRFSgL54NQA===

будет реализовано как

 public virtual bool Equals(C other)
{
    return (...) amp;amp; EqualityComparer<byte[]>.Default.Equals(<Timestamp>k__BackingField, other.<Timestamp>k__BackingField);
}
 

он использует EqualityComparer, который не использует SequenceEquals, поэтому в результате две записи с одинаковым содержимым не равны.

 using System.Collections.Generic;
using System.Diagnostics;

var a = new byte[1] { 1 };
var b = new byte[1] { 1 };

var isEqual = EqualityComparer<byte[]>.Default.Equals(a, b);

Debug.Print(isEqual.ToString()); // false
 

Я думал, что записи будут реализовывать равенство на основе значений для каждого свойства, но это, очевидно, все еще основано на ссылках, в частности, для массивов. Я на неверном пути или это просто так?

Комментарии:

1. «Я думал, что записи будут поддерживать равенство на основе значений для каждого свойства» — я думаю, что это реальная проблема, предполагая, что ваши предположения являются спецификацией. Особенно когда вы, кажется, очень хорошо знаете, что записи используются EqualityComparer<>.Default.Equals() для определения равенства.

2. @StackOverthrow Если вы хотите пожаловаться разработчикам C # на то, что вам не нравится, как они разработали функцию, SO не место для этого. Они этого не увидят, и люди здесь ничего не смогут с этим поделать. Не стесняйтесь предоставлять эту обратную связь разработчикам напрямую, если хотите.

3. @StackOverthrow: раздражает. К счастью для вас, C # — это просто C #, поэтому вы можете написать свой собственный, лучший код!

4. @sven вы можете взглянуть на библиотеку Nito Comparers Стивена Клири для большей гибкости. Функциональность, которую вы ищете, record предоставляется из коробки в Nito.