Странное поведение 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 в кортеже.

Я не могу воспроизвести это поведение с кем-либо еще, кроме поставщиков типов.

Ответы на вопрос(1)

Ваш ответ на вопрос