为什么我不能在 C# 中创建 object = bool ?

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)

svi*_*ick 5

与您在标题中所说的相反,您可以分配boolobject变量。以下代码可以正常编译:

\n\n
bool b = true;\nobject o = b;\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二行实际上所做的是将值装箱bool,将其从值类型转换为引用类型。

\n\n

这意味着它是直接包含值的b单个字节。另一方面,是一个引用(4 或 8 个字节),它指向一个包含带有值的字节以及一些元数据的对象。 trueotrue

\n\n

你不能做的是将 a 分配bool[]给类型为 的变量object[]。这是因为bool[]每个 直接包含一个字节bool,而每个项目object[]包含一个引用。

\n\n

转换bool[]object[]将是一个相当大的变化:每个框都bool必须单独装箱,并且必须为这些框的引用分配一个新数组。因此,编译器不允许您直接执行此操作。

\n\n

要使这项工作成功,您可以object[]从一开始就创建:

\n\n
object[] dirBoolArray = { curLeft, curUp, curRight, curDown };\nExtendedArray dirBool = new ExtendedArray(dirBoolArray);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将创建一个装箱数组bool,这正是您所需要的。

\n\n

还有几点注意事项:

\n\n
    \n
  • 由于您正在使用Boolean,也许您期望 和 之间存在一些差异boolBoolean就像在 Java 中一样)。在 C# 中,两者没有区别,bool只是Boolean.

  • \n
  • 使用object[]是一种代码味道,这表明您可能做错了什么。它肯定不是 C# 中通常理解的 \xe2\x80\x9cgeneric\xe2\x80\x9d 。

  • \n
\n