“Cannot modify the return value of” “because it is not a variable”
2010-03-09 15:28
344 查看
编译错误 CS1612
Cannot modify the return value of ‘expression‘ because it is not a variable
无法修改“expression”的返回值,因为它不是变量
出现这种错误的最常见情况是:
AnObject.AnStruct.Vaule = xxx;
考虑如下程序:初看没什么问题,实际上根本无法编译
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
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 MyRect
{
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; }
}
而值类型默认是按值传递的,返回的是栈上_rect的一份临时的、本地的拷贝,我们暂且称之为temp_rect,
draw.MyRect.Width = 20 等同于temp_rect.Width = 20;
因此即使能对它进行修改也无法反映到draw.MyRect本身(即_rect)的,即这是一个毫无何意义的操作,因此编译器就从源头上禁止了这样的操作。
解决方法:
1)把struct替换成class,这样,MyRect就成了一个对象(引用类型),draw.MyRect就会返回_rect在堆上的实际地址,修改也会反映到实际的对象
2)如果非要用struct不可的话,需要设置一个中间变量:
Draw draw = new Draw();
Rectangle tempRect = new Rectangle();
tempRect.Width = 20;
tempRect.Height = 12;
draw.MyRect = tempRect;
这样实际上是替换draw对象的整个_rect属性。
参考:
MSDN: Compiler Error CS1612 (编译器错误 CS1612 (C#) )
看一下就知道了,中文的比英文原版的逊多了
C# - Struct in a class.. can not access properties of the struct
延伸阅读:
CLR Generics Limitation - Modifying Values In Situ In a Container
C#: List of struct
Cannot modify the return value of ‘expression‘ because it is not a variable
无法修改“expression”的返回值,因为它不是变量
出现这种错误的最常见情况是:
AnObject.AnStruct.Vaule = xxx;
考虑如下程序:初看没什么问题,实际上根本无法编译
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
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 MyRect
{
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; }
}
而值类型默认是按值传递的,返回的是栈上_rect的一份临时的、本地的拷贝,我们暂且称之为temp_rect,
draw.MyRect.Width = 20 等同于temp_rect.Width = 20;
因此即使能对它进行修改也无法反映到draw.MyRect本身(即_rect)的,即这是一个毫无何意义的操作,因此编译器就从源头上禁止了这样的操作。
解决方法:
1)把struct替换成class,这样,MyRect就成了一个对象(引用类型),draw.MyRect就会返回_rect在堆上的实际地址,修改也会反映到实际的对象
2)如果非要用struct不可的话,需要设置一个中间变量:
Draw draw = new Draw();
Rectangle tempRect = new Rectangle();
tempRect.Width = 20;
tempRect.Height = 12;
draw.MyRect = tempRect;
这样实际上是替换draw对象的整个_rect属性。
参考:
MSDN: Compiler Error CS1612 (编译器错误 CS1612 (C#) )
看一下就知道了,中文的比英文原版的逊多了
C# - Struct in a class.. can not access properties of the struct
延伸阅读:
CLR Generics Limitation - Modifying Values In Situ In a Container
C#: List of struct
相关文章推荐
- Cannot modify the return value of 'System...ClientRectangle' because it is not a variable
- Cannot modify the return value of ...,because it is not a variable 错误分析与解决
- HTTP Error 404.2 - Not Found The page you are requesting cannot be served because of the ISAPI and CGI Restriction list settings on the Web server(转)
- The environment variable JAVA_HOME(with the value of xxx) does not point to a valid JVM installation
- 异常-----Can't convert the date to string, because it is not known which parts of the date variable are in use. Use ?date, ?time or ?datetime built-in, or ?string.\u003Cformat> or ?string(format) built-
- set command will return the value of the argument( variable, actually )
- 'ddlCities' has a SelectedValue which is invalid because it does not exist in the list of items
- Cannot execute as the database principal because the principal "guest" does not exist, this type of principal cannot be impersonated, or you do not have permission.
- SQL Server 对等复制配置失败后无法删除重建,报错:Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be im
- HTTP Error 404.2 - Not Found "The page you are requesting cannot be served because of the ISAPI and
- as打开时出现The environment variable JAVA_HOME (with The value of C:\Java\jdk1.8.0_101\bin) does not poin
- 闪回命令出错 ORA-08189: cannot flashback the table because row movement is not enabled
- 在线安装maven插件问题:Cannot complete the install because one or more required items could not be found.
- CocoaPods did not set the base configuration of your project because your project already has a custom config set.
- Cannot complete the install because one or more required items could not be f...
- The value of ESP was not properly saved across a function call.
- The return value of "mktime" in different time zone
- PHP显示Deprecated: Assigning the return value of new by reference is deprecated in解决办法
- Unity 中常见错误之一UnassignedReferenceException: The variable button of CityScript has not been assigned.
- eclipse安装maven3.*,提示“Cannot complete the install because one or more required items could not