我很想了解更多關於以下方面的信息。給定約束的輸入的obj的集合,並且下面的函數:與一般類型和裝箱/拆箱相互作用
let myList = new ResizeArray<obj>()
let addToMyListTuple<'a> (item : string * 'a) =
let boxed = box item
let unboxed = unbox<string * 'a> boxed
let item1 = match unboxed with first, _ -> first
Console.WriteLine(sprintf "%A" item1)
myList.Add(boxed)
與這些2相互作用給人的預期結果和元組的串部分可以不管被消耗在第二部分中的相關聯的類型。
addToMyListTuple("integer", 3)
addToMyListTuple("float", 3.0)
addToMyListTuple("string", "string")
addToMyListTuple("tuple", (3, "integer"))
不過,我希望將有可能是這樣的,我將能夠在以後的時間與列表中的項目進行互動,並拆箱OBJ以這樣的方式訪問元組的字符串部分將是可能的。
myList
|> Seq.iter(fun x ->
let unboxed = unbox<string * 'a> x
let item1 = match unboxed with first, _ -> first
Console.WriteLine(sprintf "%A" item1)
)
運行這給了我編譯時警告
This construct causes code to be less generic than indicated by the type annotations. The type variable 'a has been constrained to be type 'obj'.
和運行時異常
System.InvalidCastException: Unable to cast object of type 'System.Tuple`2[System.String,System.Int32]' to type 'System.Tuple`2[System.String,System.Object]'.
是否有任何其他的方式來完成這種行爲?
謝謝!它可能不如Haskell版本簡潔,但我認爲這是一個非常有趣和優雅的解決方案,我喜歡看到新的方法來利用對象符號! –