无法分配从方法返回的struct的属性

时间:2010-02-25 12:00:56

标签: c# .net struct value-type

我收到了以下从德语翻译的错误:

错误BC30068:表达式是一个值,不能作为赋值的目标。

我正在尝试执行以下操作:

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

我将Cell声明为:

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成为一个类,而是一个struct,因为否则任何访问都会在堆上创建一个新对象。当然我可以缓存所有创建的Cell Objects,但这可能会引入bug并浪费大量内存和新的间接层。

有更好的方法吗?

5 个答案:

答案 0 :(得分:1)

让它成为课堂有什么问题?

另外,为什么不使用索引器代替:

public object this[int column, int row] {
    get { return this.GetCellValue(column, row); }
    set { this.SetCellValue(column, row, value); }
}
那样,你就可以这样使用它:

sheet[column, row] = newValue;

答案 1 :(得分:1)

如果它是一个结构,你将不得不取出值,修改它,并将其传回:

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

但坦率地说,我认为你对每个单元格的一个对象(类)的断言太昂贵了,这一点......

顺便说一句,我还建议结构应尽可能不可变(出于特定原因,使用可能的 XNA例外)。

答案 2 :(得分:1)

你看到的行为是因为.net没有区分结构属性和改变字段struct本身的方法和不改变字段struct本身的方法。理想情况下,.net语言禁止在只读结构上使用任何变异方法和属性,同时允许非变异结构。不幸的是,由于.net没有提供struct方法或属性是否会改变底层结构的指示,今天的C#和vb.net只是假设属性setter会影响底层结构,而其他方法则不会。较旧的C#编译器允许调用所有结构成员代码,包括属性getter,通常会产生不希望的结果。

微软决定使用属性设置器改变结构,而不是指定那些可变的结构应该直接暴露字段或者使用静态方法修改结果,这太糟糕了。如果他们在诸如Point之类的事情上采用了这样的方法,那些导致可变结构被标记为“邪恶”的投诉就会被避免,而像你这样的代码就可以正常工作了。哦,那么多无用的“封装”的奇迹。

答案 3 :(得分:0)

我现在通过从包含索引器的Cells属性返回CellCollection来解决它。 这样我就不会再出错了,我只为所有单元格创建一个单独的对象。

答案 4 :(得分:0)

我的回答是 - 不要将Value作为财产。制作两种方法 - GetValue()SetValue()。这样就没有任何作业。