2013-04-08 78 views
3

我有一个程序,我试图扩展对象类以允许引用数组的所有成员的方法。为什么我不能在C#中创建一个object = bool?

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 []转换为类型对象[]。

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

您可以将一个可为null的'bool?'转换为一个对象。 – ja72 2013-04-08 17:26:31

+2

目前尚不清楚你想在这里完成什么。扩展阵列的预期用途是什么?与列表'有什么不同? – 2013-04-08 17:27:36

+0

谷歌拳击布尔c# – 2013-04-08 17:28:04

回答

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); 
    } 
} 
+0

他的类型的全部点似乎是故意删除类型安全,除非这只是一个意想不到的副作用。这里这对使用常规数组没有任何好处。 – Servy 2013-04-08 17:50:25

+1

我认为你只是在猜测。让我们看看OP说了些什么。 – ja72 2013-04-08 17:52:04

+0

@Servy我想让它接受抛出它的任何类型的数组。 注意:虽然我有Basic和Java的经验,但我是一个相对较新的C#程序员。我也不知道'T []'意味着什么,也不知道''语法的含义。 – joesumbody122 2013-04-09 15:12:28

2

数组协变只适用于成员可以转换而不改变它们的表示(加上其他限制)的情况。

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

+1

我怀疑OP是否知道协方差是什么。 – svick 2013-04-08 17:30:07

4

相反,你在你的标题说,你可以指定boolobject变量。下面的代码编译细:

bool b = true; 
object o = b; 

什么第二行实际上做的是,它的boxesbool值,其从一个值类型并将其转换为引用类型。

这是什么意思是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,也许你期待有(象Java)boolBoolean有些区别。在C#中两者没有区别,bool只是Boolean的别名。

  • 使用object[]是代码异味,说你可能做错了什么。在C#中通常理解单词的方式当然不是“通用”的。

+1

你的输入是非常有用的svick。谢谢。 – joesumbody122 2013-04-09 16:06:27

相关问题