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

时间:2013-04-08 17:12:34

标签: c# arrays object boolean

我有一个程序,我试图扩展对象类,以允许一个引用数组的所有成员的方法。

ExtendedArray类代码:

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
}

我打算在将来使用这个类并添加它,所以它非常通用。虽然当我尝试使用构造函数时它出错但不能隐式地将类型bool []转换为类型object []。

Boolean[] dirBoolArray = { curLeft, curUp, curRight, curDown };
ExtendedArray dirBool = new ExtendedArray(dirBoolArray);

3 个答案:

答案 0 :(得分:4)

与您在标题中所说的内容相反,您可以将bool分配给object变量。以下代码编译良好:

bool b = true;
object o = b;

第二行实际上做的是boxes bool值,它将值从类型转换为引用类型。

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

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

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

您可以做的是从头开始创建object[]

object[] dirBoolArray = { curLeft, curUp, curRight, curDown };
ExtendedArray dirBool = new ExtendedArray(dirBoolArray);

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

几点注释:

  • 由于您使用的是Boolean,因此您可能希望boolBoolean之间存在一些差异(如Java中所示)。在C#中,两者之间没有区别,bool只是Boolean的别名。

  • 使用object[]是一种代码气味,表示您可能做错了什么。它在C#中通常被理解的方式肯定不是“通用的”。

答案 1 :(得分:2)

只有在不改变其表示形式的情况下转换成员(以及其他一些限制)时,数组协方差才有效。

这意味着您可以将引用类型的数组强制转换为object[],但不能将包含值类型的数组强制转换为object[]。从bool转换为object不会保留该表示形式,因此无法将bool[]转换为object[]

答案 2 :(得分:1)

为什么你不能这样做:

class ExtendedArray<T> 
{
    private T[] referredTo;

    public ExtendedArray()
    {
        referredTo=null;
    }//empty constructor

    public ExtendedArray(T[] obj)
    {
        referredTo=obj;
    }//full constructor

    public void referToAll(T changeTo)
    {
        for(int x=0; x<referredTo.Length; x++)
        {
            referredTo[x]=changeTo;
        }

    }//referToAll(bool)

}//ExtendedArray <== class

class Program
{
    static void Main(string[] args)
    {
        ExtendedArray<bool> array=new ExtendedArray<bool>(new bool[10]);
        array.referToAll(true);
    }
}