2017-05-09 87 views
5

以下代碼中的最後兩行出現編譯器錯誤?F#元組,System.Tuple和集合 - 類型約束不匹配?

open System 

let s = new System.Collections.Generic.Stack<Tuple<int, int>>() 
s.Push(1, 2) // The type ''a * 'b' is not compatible with the type 'Tuple<int,int>' 
s.Push(Tuple.Create(1, 2)) 

s.Push(Tuple.Create(1, 2))

 
Type constraint mismatch. The type 
    ''a * 'b'  
is not compatible with type 
    'Tuple' 
The type ''a * 'b' is not compatible with the type 'Tuple' 
type Tuple = 
    static member Create : item1:'T1 -> Tuple + 7 overloads 
Full name: System.Tuple 

回答

3

雖然F#元組的錯誤消息與在編譯形式System.Tuple表示的,它們不被認爲從邏輯觀點來看語言的「別名」它。就F#編譯器而言,

int * intSystem.Tuple<int, int>不一樣。

只需使用F#元組的語法爲Stack通用參數,它會工作:

let s = new System.Collections.Generic.Stack<int * int>() 
s.Push(1, 2) 
+3

最奇怪的事是什麼'讓T = Tuple.Create(1,2)'得到的'類型int * int'代替't'而不是'Tuple '。 – ca9163d9

+1

這確實是奇特的。我已經報告它是一個問題:https://github.com/Microsoft/visualfsharp/issues/3016 –

+0

唐關閉了問題。不過,我認爲F#編譯器至少應該給出一些解釋 - 所以人們不會感到困惑。 – ca9163d9