2014-09-28 261 views
1

我有一个数组,我想将其转换为对象。这是我的代码。将数组投射到对象

let a = [| 1 |] 
let b = a :?> obj 

但它告诉我,int [] has no proper subtypes and cannot be used as a source of runtime type coercion。我敢肯定,我总是可以在C#中执行(object),而不需要编译器抱怨,所以这里有什么问题?

回答

8

您正试图向下倾倒(:?>),而不是向上倾斜(:>)。您的代码应该是:

let a = [| 1 |] 
let b = a :> obj 

有关更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/dd233220.aspx

+0

哇,你说得对。我不知道为什么这不会发生在我身上。我甚至明确地驳斥了这个想法...... – 2014-09-28 20:43:05

7

虽然低潮的答案当然是正确的,有一个obj为向上转型的特殊情况下,另一种解决方案,这是box操作:

let a = [| 1 |] 
let b = box a 

在F#,box不具有相同的含义它在CLR中执行,它意味着“使一个引用类型对象对应于一个值类型值”。在F#中,它只是表示“投射到obj”。因此,您可以使用box以及引用类型以及值类型。