Необычное поведение в поставщиках типов
иметь провайдера типов с тремя свойствами 'a', 'b'и "с" типа "строка ','опция строки ' а также 'int option 'соответственно.
Когда у меня есть экземпляр с "", None и Some 1 в этих свойствах, это терпит неудачу:
(row1.a, row1.b, row1.c) |> should equal ("", None, Some 1)
Но все это прекрасно работает:
row1.a |> should equal ""
row1.b |> should equal None
row1.c |> should equal (Some 1)
("", None, Some 1) |> should equal ("", None, Some 1)
Как это возможно? Что может сделать None в b отличным от любого другого None? После компиляции None является просто нулем, могут ли два значения NULL отличаться в .Net?
Кортежи имеют структурное равенство, как и большинство типов F #, поэтому оно должно работать. Я получаю исключение NUnit.Framework.AssertionException с сообщением:
Expected:
But was:
NUnit просто вызывает .Equals, так чтогде проблема.
Это также не удается:
(row1.a, row1.b, row1.c).Equals(("", None, Some 1)) |> should equal true
Тип времени выполненияrow1
являетсяSystem.Tuple
так что даже это должно работать в теории:
row1 |> should equal ("", None, Some 1)
И на самом деле это происходит, когда естьнет нетNone
в кортеже.
Я могу'Воспроизвести это поведение с кем-либо еще, кроме поставщиков типов.