joe*_*122 3 c# arrays boolean object
我有一个程序,我试图扩展对象类以允许引用数组所有成员的方法。
ExtendArray类的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleMaze
{
class ExtendedArray : Object
{
private object[] referredTo;
public ExtendedArray()
{
referredTo = null;
}//empty constructor
public ExtendedArray(Object[] obj)
{
referredTo = obj;
}//full constructor
public void referToAll(object changeTo)
{
for (int x = 0; x < referredTo.Length; x++)
{
referredTo[x] = changeTo;
}
}//referToAll(bool)
}//ExtendedArray <== class
}
Run Code Online (Sandbox Code Playgroud)
我打算在将来使用这个类并向其中添加一些东西,所以它非常通用。尽管当我尝试使用构造函数时,它会出错,无法隐式地将类型 bool[] 转换为类型 object[]。
Boolean[] dirBoolArray = { curLeft, curUp, curRight, curDown };
ExtendedArray dirBool = new ExtendedArray(dirBoolArray);
Run Code Online (Sandbox Code Playgroud)
与您在标题中所说的相反,您可以分配bool给object变量。以下代码可以正常编译:
bool b = true;\nobject o = b;\nRun Code Online (Sandbox Code Playgroud)\n\n第二行实际上所做的是将值装箱bool,将其从值类型转换为引用类型。
这意味着它是直接包含值的b单个字节。另一方面,是一个引用(4 或 8 个字节),它指向一个包含带有值的字节以及一些元数据的对象。 trueotrue
你不能做的是将 a 分配bool[]给类型为 的变量object[]。这是因为bool[]每个 直接包含一个字节bool,而每个项目object[]包含一个引用。
转换bool[]为object[]将是一个相当大的变化:每个框都bool必须单独装箱,并且必须为这些框的引用分配一个新数组。因此,编译器不允许您直接执行此操作。
要使这项工作成功,您可以object[]从一开始就创建:
object[] dirBoolArray = { curLeft, curUp, curRight, curDown };\nExtendedArray dirBool = new ExtendedArray(dirBoolArray);\nRun Code Online (Sandbox Code Playgroud)\n\n这将创建一个装箱数组bool,这正是您所需要的。
还有几点注意事项:
\n\n由于您正在使用Boolean,也许您期望 和 之间存在一些差异bool(Boolean就像在 Java 中一样)。在 C# 中,两者没有区别,bool只是Boolean.
使用object[]是一种代码味道,这表明您可能做错了什么。它肯定不是 C# 中通常理解的 \xe2\x80\x9cgeneric\xe2\x80\x9d 。
| 归档时间: |
|
| 查看次数: |
5663 次 |
| 最近记录: |