【发布时间】:2014-03-26 00:37:58
【问题描述】:
我想找到在 C# .NET 4.0 中将 bool[] 转换为 object[] 的最佳方法。
现在我有了这个变量:
object[] objectArray = new object [] { true, false, true };
string[] stringArray = new string[] { "true", "false", "true" };
bool[] boolArray = new bool[] { true, false, true };
一切都很好。对于“明确类型”,例如 bool 和 object、boxing 可以正常工作 (object o = true;)。但在这种情况下,我只能从字符串数组转换为对象数组,而不能从布尔数组转换:
objectArray = stringArray; // OK
objectArray = boolArray; // WRONG Cannot implicitly convert bool[] to object[]
此外,在某些方法中,我会发送对象数组列表。与之前的情况一样,我可以对字符串执行此(转换),但不能对布尔数组执行此操作:
List<object[]> testList;
testList = new List<object[]>() { objectArray }; // OK
testList = new List<object[]>() { stringArray }; // OK
testList = new List<object[]>() { boolArray }; // WRONG - I can not add bool[] into object[]
从一些方法中,我有一个布尔数组,里面有很多项目......最后一个方法,经过所有计算,返回一个对象数组作为结果(有时它必须返回其他类型,我不想拆分它变成了多种方法)。
然而,我不能使用return_object_array = boolean_array。这样做的最佳方法是什么?循环遍历布尔数组中的所有值并将其存储到对象数组中是最快的方式吗?
最好/最快/最正确的方法是什么?
注意:此方法是在 .NET 4.0 下编写的,但如果您知道 . NET 4.5 我想知道。
【问题讨论】:
-
boolaray.Select(x => (object)x).ToList(); -
我认为这是一个 X/Y 问题 - 为什么要首先将布尔数组转换为对象数组?为什么该方法返回不同类型的数组?你为什么和
List<object[]>一起工作? -
我不能使用泛型类型,因为创建了一些实现接口的方法(不是我的接口:))。但我知道使用泛型更好。
-
它与
string而不是bool一起工作的原因是string是一个引用类型,而.NET中的covariance特性只适用于引用类型.对于数组,string[]也是object[],因为 .NET 1 样式 数组协方差。这种协方差是“危险的”,因为数组不是只读的;每次您尝试编写对引用类型数组的新引用时,.NET 都会执行类型检查!使用接受IEnumerable<>的List<>的构造函数,它通过自.NET 4(2010 年,C# 4:interface IEnumerable<out T>)以来在泛型中引入的协方差来工作。 -
@Matt 一个简单的疏忽。你不必写那么长的评论来说明明显:)