TearSnow Fan


[C#] struct错误:无法修改“…”的返回值,因为它不是变量

今天师妹调试程序时,出现了编译错误 CS1612

Cannot modify the return value of ‘expression‘ because it is not a variable

无法修改“expression”的返回值,因为它不是变量

出现这种错误的最常见情况是使用了如下的赋值语句:

AnObject.AnStruct.Vaule = xxx;

以如下的程序为例,初一看似乎没什么问题,实际上根本无法编译。

public struct Rectangle
{
    private int _Width;
    private int _Height;
    public int Width
    {
        get { return _Width; }
        set { _Width = value; }
    }
    public int Height
    {
        get { return _Height; }
        set { _Height = value; }
    }
    public Rectangle(int width, int height)
    {
        this._Width = width;
        this._Height = height;
    }
}

public class Draw
{
    private Rectangle _rect = new Rectangle(0, 0);
    public Rectangle Rect
    {
        get { return _rect; }
        set { _rect = value; }
    }
    public Draw() { }
    public Draw(int mapWidth, int mapHeight)
    {
        _rect = new Rectangle(mapWidth, mapHeight);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Draw draw = new Draw();
        draw.MyRect.Width = 20;    //《== 编译错误
        draw.MyRect.Height = 12;    //《== 编译错误
    }
}

draw是引用类型,MyRect是struct,也就是值类型,当访问draw.MyRect时,会首先调用如下的程序:

public Rectangle MyRect
{
    get { return _rect; }
    set { _Width = value; } //只用到了get,和set无关
}

因为值类型默认是按值传递的,因此返回的是栈上的 _rect 的一份临时的、本地的拷贝,我们暂且称之为 temp_rect 好了。

因此,使 draw.MyRect.Width = 20;就等同于使这个 temp_rect.Width = 20;

由于存在栈上的这个本地副本,即使能对它进行修改,也无法最终反映到 draw.MyRect 本身(即 _rect)上,因此这是一个毫无何意义的操作,故C#编译器就从源头上禁止了这样的操作。

解决方法:

方法一:

把struct替换成class,这样,MyRect就成了一个对象(引用类型),draw.MyRect就会返回_rect在堆上的实际地址,修改也会反映到实际的对象

方法二:

如果非要用struct不可的话,需重新生成一个所用到的struct,即设置一个中间变量:

Draw draw = new Draw();
Rectangle tempRect = new Rectangle();
tempRect.Width = 20;
tempRect.Height = 12;
draw.MyRect = tempRect;

这样实际上是替换 draw 对象的整个 _rect 属性(即整个struct)。

参考资料:

[1] CSDN博客 - 站在巨人的肩膀上:http://blog.csdn.net/onlyou930/article/details/5568319

[2] MSDN: Compiler Error CS1612 (编译器错误 CS1612 (C#) )

本文固定链接: http://blog.xieyc.com/csharp-cannot-modify-the-return-value-of-expression-because-it-is-not-a-variable/ | 小谢的小站

该日志由 xieyc 于2013年07月01日发表在 编程 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: [C#] struct错误:无法修改“…”的返回值,因为它不是变量 | 小谢的小站
关键字:

[C#] struct错误:无法修改“…”的返回值,因为它不是变量:等您坐沙发呢!

发表评论

:wink: :neutral: :mad: :twisted: :smile: :shock: :sad: :roll: :oops: :eek: :mrgreen: :lol: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

快捷键:Ctrl+Enter