2013-10-24 26 views
3

我试图使用对象处理程序,我有这个工作正常,把东西放在内存中。但是,当我再次查找对象我回:是否有像f#一样的通用unbox函数?

object(object[,]) 

object(double[,]) 

我如何在C#拆箱呢?

object(double[,]) boxedobj = .... 
double[,] unboxedobj = unbox(boxedobj); 

理想我想这样做在一个通用的方式,以便它不重要的tybe是否为双[]或双[,]或[对象],等

+2

我没有看到您的示例。这些是参考类型,所以装箱/拆箱不起作用。 – CodesInChaos

+0

我不太明白这个例子,但它听起来像是[泛型]的工作(http://msdn.microsoft.com/en-us/library/ms379564(v = vs.80).aspx) –

+1

为什么你会把东西放在第一位吗? – Reda

回答

8

F#unbox函数几乎可以转换为您指定的任何其他类型。在C#中,这可能是这样写的:

static R Unbox<R>(object anything) { 
    return (R)anything; 
} 

所以你的情况与double[,]你需要这样的:

var array = (double[,])boxed; 

在大多数情况下unbox<'R> anything也只是意味着使用(R)anything铸造。在这种情况下唯一的情况是而不是工作是当您在另一个通用方法中并且您正在两种泛型类型之间进行投射时。在这种情况下,您首先需要去object(以确保数值已装箱):

static R Unbox<R, T>(T anything) { 
    return (R)(object)anything; 
} 
+0

谢谢,一如既往非常有帮助 – nik

+0

c#'unbox '不是很有用,因为类型推断不' t返回值的解析,所以'T'必须是明确的。 – colinfang

4

除非我缺少你的观点,从object铸造/应自动盒/拆箱值类型为你(一个数组是不是值类型,BTW):

double d = 0.0; // not boxed 

object obj = d; // boxed 

double d2 = (double)obj; // unboxed 

更大的问题是 - 如果你为什么护理其盒装或不?

+0

谢谢! - 请参阅上面的提示为什么或可能是因为我仍然在学习,并不总是知道什么是最好的方法... – nik

相关问题