3

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

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);
4

3 回答 3

5

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

bool b = true;
object o = b;

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

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

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

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

你可以做的是object[]从一开始就创建:

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

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

还有一些注意事项:

  • 由于您使用的是 ,因此您可能期望andBoolean之间存在一些差异(就像在 Java 中一样)。在 C# 中,两者没有区别,只是.boolBooleanboolBoolean

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

于 2013-04-08T20:58:14.050 回答
2

数组协方差仅在成员可以在不改变其表示的情况下进行转换(加上一些其他限制)时才有效。

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

于 2013-04-08T17:27:57.053 回答
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);
    }
}
于 2013-04-08T17:34:36.837 回答