2010-02-25 51 views
4

返回結構的財產,我得到了下面的錯誤,我從德國翻譯:無法分配從法

錯誤BC30068:表達式是一個值,不能作爲賦值目標。

我努力做到以下幾點:

sheet.Cells(row, col).Value = newVal ' this is VB 

當我宣佈細胞:

public Cell Cells(int x, int y) // this is C# 
{ 
    return new Cell(this, x, y); 
} 

public struct Cell 
{ 
    Worksheet ws; 
    int x; 
    int y; 

    public Cell(Worksheet ws, int x, int y) 
    { 
     this.ws = ws; 
     this.x = x; 
     this.y = y; 
    } 

    public object Value 
    { 
     get { return ws.GetCellValue(x, y); } 
     set { ws.SetCellValue(x, y, value); } 
    } 
} 

我怎樣才能解決這個問題?我不希望Cell是一個類,而是一個結構,因爲否則任何訪問都會在堆上創建一個新對象。當然,我可以緩存所有創建的單元對象,但是這可能會引入錯誤並浪費大量內存和新的間接層。

有沒有更好的方法來做到這一點?

+0

Duplicate:http://stackoverflow.com/questions/2082900/c-getter-setter-problem總結:你可以做的事情不多。要麼需要用新值實例化一個新結構,並將其賦值給該屬性,或者爲父類中的結構的每個字段創建訪問器,並分別修改它們。 – 2010-02-25 12:04:46

+0

有趣的問題,而不是一個重複的恕我直言。單元格可能看起來像編譯器的可變結構,而實際上它不是(假設Worksheet是一個類)。 – Henrik 2010-02-25 13:11:46

回答

0

我現在通過從包含索引器的Cells屬性返回一個CellCollection來解決它。 這樣Iam不會再出現錯誤,我只是爲所有單元創建一個單獨的對象。

1

使其成爲課堂的問題是什麼?

而且,你爲什麼不只是使用,而不是一個索引:

public object this[int column, int row] { 
    get { return this.GetCellValue(column, row); } 
    set { this.SetCellValue(column, row, value); } 
} 

這種方式,你可以使用它像:

sheet[column, row] = newValue; 
+0

我忘了說我不能修改VB代碼,只是C#代碼。正如我所說,使它成爲一個類的問題是它浪費了大量內存。 – codymanix 2010-02-25 12:30:49

1

如果它是一個結構,你將不得不讓出的值,修改它,並把它傳遞迴:

Cell cell = sheet.Cells(row, col); 
cell.Value = newVal; 
sheet.Cells(row, col) = cell; // assuming this has a setter 

但坦率地說,我認爲你的每一個對象(類)的斷言細胞是太貴缺少點......

BTW,我也要提醒,結構應該是一成不變的儘可能(與可能例外XNA的,具體原因)。

+0

事實上,我的struct *是*不可變的。請注意,Cell中唯一的setter只是調用ws.GetCellValue(x,y),所以它不會修改它自己。這只是VB.NET編譯器*認爲*我的結構是可變的,這是錯誤的,這是我的整個問題:) – codymanix 2010-02-26 09:07:48

0

我的答案是 - 不要讓Value屬性。使它有兩種方法 - GetValue()SetValue()。這樣就沒有任務了。

1

您所看到的行爲是.net不區分結構屬性和使結構本身發生變化的方法和不發生變化的方法的結果。理想情況下,.net語言將禁止在只讀結構中使用任何變異方法和屬性,同時允許非變異結構。不幸的是,由於.NET沒有提供結構方法或屬性是否會改變底層結構的指示,今天的C#和VB.NET只是假定屬性設置器會影響底層結構,而其他方法則不會。較早的C#編譯器允許調用所有結構成員代碼,包括屬性獲取器,通常會帶來不希望的結果。

微軟認爲結構應該使用屬性設置器進行變異,而不是指定那些可變的結構應該直接暴露字段,或者使用靜態方法修改,這太糟糕了。如果他們對Point這樣的方法採用了這種方法,那麼可能會導致可變結構被標記爲「邪惡」的投訴將被避免,而像你這樣的代碼將會工作得很好。噢,很好,爲無用的「封裝」的奇蹟。