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

相關問題