我有一个程序,我试图扩展对象类,以允许一个引用数组的所有成员的方法。
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);
答案 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
,因此您可能希望bool
和Boolean
之间存在一些差异(如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);
}
}