Странное поведение None в поставщиках типов
иметь поставщика типов с тремя свойствами 'a', 'b' и 'c' типа 'string', 'string option' и '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: <(, , Some(1))>
But was: <(, , Some(1))>
NUnit просто вызывает .Equals, вот в чем проблема.
Это также не удается:
(row1.a, row1.b, row1.c).Equals(("", None, Some 1)) |> should equal true
Тип времени выполненияrow1
являетсяSystem.Tuple<string,Microsoft.FSharp.Core.FSharpOption<string>,Microsoft.FSharp.Core.FSharpOption<int>>
так что даже это должно работать в теории:
row1 |> should equal ("", None, Some 1)
И на самом деле это происходит, когда нетNone
в кортеже.
Я не могу воспроизвести это поведение с кем-либо еще, кроме поставщиков типов.