1. 程式人生 > >C# struct的陷阱:無法修改“...”的返回值,因為它不是變數

C# struct的陷阱:無法修改“...”的返回值,因為它不是變數

編譯錯誤 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屬性。 參考: 看一下就知道了,中文的比英文原版的遜多了

相關推薦

C# struct陷阱無法修改“...”的返回因為變數

編譯錯誤 CS1612 Cannot modify the return value of ‘expression‘ because it is not a variable 無法修改“expression”的返回值,因為它不是變數 出現這種錯誤的最常見情況是: AnObje

C++的雜七雜八我家的返回可能這麼傲嬌(右引用和移動語義)

大凡程式語言,都會有“函式”這個概念。而對於外部而言,一個函式最重要的部分就是它的返回值了。 說這裡,返回值其實應該是一個很簡單的話題。當需要通過函式傳遞一個值出去的時候,使用返回值不是理所當然的嘛,比如說,像下面這樣: int add(int a, int b)

c++學習之根據GetLastError()返回獲取錯誤資訊

注:本文屬於轉載,詳細出處忘記了,如果找到了會加上出處。 VC中GetLastError()獲取錯誤資訊的使用在VC中編寫應用程式時,經常需要涉及到錯誤處理問題。許多函式呼叫只用TRUE和FALSE來表明函式的執行結果。一旦出現錯誤,MSDN中往往會指出請用GetLas

C#Process.Start獲取main函式返回以及控制檯輸出重定向到文字框

1、Process.Start()返回啟動程序main函式的返回值   private void button1_Click(object sender, EventArgs e)         {             Process da = new Process

啟動MongoDB提示無法啟動此程式因為計算機中丟失api-ms-win-crt-runtime-|1-1-0.dll

前提:已完成好MongoDB 進入MongoDB安裝根目錄下的bin目錄下,啟動MongoDB 啟動mongod.exe提示“無法啟動此程式,因為計算機中丟失api-ms-win-crt-runtime-|1-1-0.dll” 解決方法 微軟官方提供的 vc_

Mysql 下載與安裝問題一無法啟動此程式因為計算機丟失MSVCR120.dll

宣告:本文只針對我所安裝的Mysql 5.7.18(64位)版本所遇到的問題。 問題:          安裝MySQL資料庫,執行如下命令:         mysqld.exe -install

w764位運行python報錯無法啟動此程序因為計算機中丟失api-ms-win-crt-process-l1-1-0.dll

process 搜索 direct 目錄 window 網盤 缺失 無法 -- 安裝python3.6.5,安裝成功後,在cmd窗口輸入python檢查是否安裝成功,報錯如下圖: 針對這個問題,在網上查詢了多種方法試過都未解決: 方法1:我的電腦是64位的,安裝的pyth

無法將 lambda 表達式 轉換為類型“System.Delegate”因為是委托類型

clas 遇到 轉換 info 問題 div 必須 logs 表達式 今天寫winform的時候遇到一個問題,提示: 無法將 lambda 表達式 轉換為類型“System.Delegate”,因為它不是委托類型, 主要是為了在子線程中更新UI線程,在wpf中同樣的

Error occurred in deployment step ‘Retract Solution‘: xxx 無法反序列化因為沒有公共的默認構造函數

rsh chang str visual 原來 custom change family deploy 一.環境:SharePoint 2016 + Visual Studio 2015, 二.錯誤描述: 錯誤1:幫朋友寫個計時器Demo,部署位置GAC,來回部署幾次後

seajs開篇我為什麼學習seajs因為的"預先下載,延遲執行"特性

之前參與的2個專案都用到了js模組化工具requireJS框架,工作之餘學習了這個框架,也熟悉了requireJS的基本用法以及AMD規範。本來對seaJS沒有太大的興趣,知道它實現了CMD規範,功能

C語言const禁止修改變數

C語言const:禁止修改變數的值 有時候我們希望定義這樣一種變數,它的值不能被改變,在整個作用域中都保持固定。例如,用一個變數來表示班級的最大人數,或者表示緩衝區大小。為了滿足這一要求,可以使用const關鍵字對變數加以限定: const int MaxNum = 100; 

C#進階系列——WebApi 介面返回困惑返回型別詳解

前言:已經有一個月沒寫點什麼了,感覺心裡空落落的。今天再來篇乾貨,想要學習Webapi的園友們速速動起來,跟著博主一起來學習吧。之前分享過一篇 C#進階系列——WebApi介面傳參不再困惑:傳參詳解 ,這篇博文內容本身很基礎,沒想到引起很多園友關注,感謝大家的支援。作為程式猿,我們都知道引數和返回值是程式設計

C++引用經典例題之引用作為函式的返回結合函式棧幀詳解

程式碼如下: #include <stdio.h> #include <windows.h> #include <iostream> using namespa

.NET(C#)獲取方法返回的自定義特性(Attribute)

.NET中特性的索取就是圍繞著ICustomAttributeProvider介面(System.Reflection名稱空間內),而MethodInfo類的ReturnTypeCustomAttributes屬性直接返回方法返回值的ICustomAttributeProvider介面物件。同時Method

語法C語言中printf函式的返回

平時真不怎麼關注printf的返回值,一般是直接呼叫printf格式化輸出,今天做騰訊的筆試題發現了一個知識漏洞,特此記錄。 首先,題目是這樣的: int f(int a, int b, int c) { return 0; } int main()

python開發編程基礎函數定義返回參數

pan span true 調用 odin pwd 括號 問題 pre 一,函數的定義 1,函數mylen叫做函數名  #函數名  #必須由字母下劃線數字組成,不能是關鍵字,不能是數字開頭  #函數名還是要有一定的意義能夠簡單說明函數的功能2,def是關鍵字 (defi

ajax回調函數回調無法獲取返回

nbsp .json 開始 str error: != 註入 null ole function kakaajax(obj, callback) { //函數執行第一步傳入兩個參數(obj,callback(a))所以如果想在此處獲取 ajax的返回值沒門因為請求未發出

Android平臺調用Web Service線程返回

繼承 write 能夠 call() ted uil code 等待 @override 接上文 前文中的遺留問題 對於Java多線程的理解。我曾經只局限於實現Runnable接口或者繼承Thread類,然後重寫run()方法,最後start()調用就算完事。可

c#中 命令copy 已退出,返回為1

col .cn 文件 返回 copy nbsp spa round img 後期生成時間命令行,可以指定生成目錄,是否刪除.pdb文件 c#中 命令copy 已退出,返回值為1

jmeter 源碼修改返回中文Unicode編碼問題

argument gif sam data class http請求 sample listen alt 修改jmeter源碼,可能會對其他格式的responseData有一定影響,圖片或者其他 在 ListenerNotifier 類中找到 notifyListeners