The tuple type F # (syntax tuple) is compiled as System.Tuple<..>. Thus, they are of the same type at the .NET level, but for the F # type system they are different types: the type of the syntax tuple will not match the type System.Tuple<..>, but their runtime type will be the same.
You can find a detailed description in F # spec
Example c new System.Tuple<'t>()does not return a syntax tuple, perhaps because you are explicitly creating a specific type, and you should get just that.
Here are some tests:
let x = new System.Tuple<_,_>(2,3)
let y = System.Tuple.Create(2,3)
let areEqual = x.GetType() = y.GetType()
let f (x:System.Tuple<int,int>) = ()
let g (x:int * int) = ()
let a = f x
let b = g y
let c = f y
let d = g x
So, at compile time they are different, but at runtime they are the same. Therefore, when you use .GetType(), you get the same result.
source
share