是否有像 f# 中那样的通用开箱函数

本文关键字:函数 是否 | 更新日期: 2023-09-27 18:36:53

我正在尝试使用对象处理程序,并且我可以正常工作,可以将内容放入内存中。但是当我再次查找对象时,我返回:

object(object[,]) 

object(double[,]) 

如何在 C# 中将其拆箱?

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

理想情况下,我想以通用的方式执行此操作,这样 tybe 是 double[] 还是double[,] 或对象 [,] 等都无关紧要

是否有像 f# 中那样的通用开箱函数

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;
}

除非我错过了你的观点,否则投射到/从object投射应该会自动为你装箱/取消装箱值类型(数组不是值类型,顺便说一句):

double d = 0.0;  // not boxed
object obj = d;  // boxed
double d2 = (double)obj;  // unboxed

更大的问题是 - 你为什么关心它是否盒装?