共用方式為


解決不安全程式碼建構中的錯誤和警告

本文涵蓋下列編譯器錯誤:

  • CS0193* 或 -> 運算子必須套用至資料指標
  • CS0196指標只能由一個值編製索引
  • CS0208無法取得受管理類型('type')的位址、取得其大小或宣告指向其的指標
  • CS0209在固定語句中宣告的局部類型必須是指標類型
  • CS0210您必須在固定或 using 陳述式宣告中提供初始化子
  • CS0211無法取得指定運算式的位址
  • CS0212您只能在固定語句初始化中取得未固定運算式的位址
  • CS0213您無法使用 fixed 語句來取得已固定表達式的位址
  • CS0214指標和固定大小緩衝區只能在不安全的內容中使用
  • CS0227只有在使用 /unsafe 編譯時,才會出現不安全的程式代碼
  • CS0233:「 識別碼」沒有預先定義的大小,因此 sizeof 只能在不安全的內容中使用
  • CS0242此操作未定義於 void 指標上
  • CS0244'' 和 'isas' 在指標類型上都無效
  • CS0254固定陳述式指派的右側可能不是強制轉換運算式
  • CS0459無法採用唯讀區域變數的位址
  • CS0821無法修正隱含類型的區域變數
  • CS1641固定大小緩衝區欄位必須在欄位名稱之後具有陣列大小指定元
  • CS1642固定大小的緩衝區欄位只能是結構的成員。
  • CS1656無法指派給 'variable',因為它是 '唯讀變數類型'
  • CS1663固定大小緩衝區類型必須是下列其中一項:boolbyte、或shortintlongcharsbyteushortuintulongfloatdouble
  • CS1665固定大小緩衝區的長度必須大於零
  • CS1666您無法使用未鎖定運算式中包含的固定大小緩衝區。嘗試使用 fixed 語句。
  • CS1708固定大小緩衝區只能透過區域變數或欄位存取
  • CS1716請勿使用 'System.Runtime.CompilerServices.FixedBuffer' 屬性。請改用「固定」欄位修飾符。
  • CS1919不安全的類型 '類型名稱' 無法用於物件建立。
  • CS4004無法 await 於不安全的上下文中
  • CS8812無法將群組轉換 &Method 成非函式指標類型。
  • CS9123不應該在非同步方法中的參數或區域變數上使用 '&' 運算子。

指標操作和解引用

  • CS0193:必須將*->運算子套用至資料指標
  • CS0196指標只能由一個值編製索引
  • CS0242問題中的作業在 void 指標上未定義

若要正確使用指標操作,請遵循取消引用、索引和算術運算的規則。 如需詳細資訊,請參閱 指標類型函式指標

  • 僅將 *-> 運算子套用到資料指標(CS0193)。 請勿將這些運算子與非指標類型或函式指標搭配使用。 函數指標無法在 C# 中取消參考,這與 C/C++ 不同。
  • 只有一個值的索引指標 (CS0196)。 指標不支援多維度索引。
  • 避免在 void 指標上未定義的作業 (CS0242) 。 例如,不要遞增 void 指標,因為編譯器不知道所指向之資料的大小。

指標型別和受管理型別

  • CS0208無法取得受管理類型('type')的位址、取得其大小,或宣告指向它的指標
  • CS0233:「 識別碼」沒有預先定義的大小,因此 sizeof 只能在不安全的內容中使用

若要正確使用指標和 sizeof 運算子,請使用非受控類型和適當的內容。 如需詳細資訊,請參閱 非受控類型sizeof 運算子

  • 僅將指標與非受控類型搭配使用 (CS0208) 。 請勿取得受控類型的位址、計算受控類型的大小或宣告指向受控類型的指標。 受控類型包括包含參考類型欄位或屬性的參考類型和結構。
  • 在類型大小不是編譯時間常數的情境中使用sizeof運算子unsafeCS0233)。

固定緩衝區

  • CS0209固定語句中宣告的本機類型必須是指標類型
  • CS0210您必須在固定或 using 陳述式宣告中提供初始化運算式
  • CS0211無法取得給定運算式的位址
  • CS0212您只能在固定陳述式初始化運算式內取得未固定運算式的位址
  • CS0213您無法使用 fixed 陳述式來取得已固定運算式的位址
  • CS0254固定語句指派的右側不能是強制轉換運算式
  • CS0459無法取唯讀的區域變數的位址
  • CS0821無法修正隱含類型的區域變數
  • CS1656無法指派給 'variable',因為它是 '唯讀變數類型'

當您不正確地使用 fixed 陳述式 時,就會發生這些錯誤。 此 fixed 陳述式可防止垃圾回收器重新定位可移動變數,並宣告指向該變數的指標。 如需詳細資訊,請參閱 不安全的程式碼和指標

若要正確使用fixed語句:

  • 將變數宣告為指標類型 (CS0209) 。
  • fixed 陳述式宣告中提供一個初始化器(CS0210)。
  • 只使用有效運算式的位址:欄位、區域變數和指標間接 (CS0211)。 不要將計算表達式的地址視為兩個變量的總和。
  • 僅在fixed陳述式初始化運算式內對未固定運算式使用位址運算子(CS0212)。
  • 請勿在已修正的表達上使用 fixed 陳述式 (CS0213)。 方法中的 unsafe 局部變數和參數已經固定在堆疊上。
  • 請勿在語句指派的 右側使用類型轉換表達式 (CS0254
  • 請勿採用唯讀區域變數的位址 (CS0459) 。 迴圈、foreach陳述式和using陳述式中的fixed變數是唯讀的。
  • 使用明確類型,而不是在 fixed 陳述式中使用 varCS0821)。
  • 請勿指派給唯讀內容中的變數,例如 foreach 迴圈、 using 陳述式或 fixed 陳述式 (CS1656)。

不安全環境限制

  • CS0214指標和固定大小緩衝區只能在不安全的內容中使用
  • CS0227只有在使用 /unsafe 編譯時,才會出現不安全的程式代碼
  • CS0244'is' 和 'as' 在指標類型上都無效
  • CS1919不安全的類型 'type name' 無法用於物件建立
  • CS4004無法在不安全的環境中等待
  • CS9123不應該在非同步方法中的參數或區域變數上使用 '&' 運算子

當您使用不安全的程式碼建構而沒有適當的不安全內容,或嘗試不安全程式碼中不允許的作業時,就會發生這些錯誤。 如需詳細資訊,請參閱 不安全的程式代碼和指標 以及 unsafe 關鍵字

若要正確使用不安全的程式碼:

  • 使用關鍵字 (unsafe) 標示使用指標或固定大小緩衝區的方法、類型或程式碼區塊。
  • 使用關鍵字 (CS0227) 時,請在專案設定中啟用 unsafe 編譯器選項。
  • 請勿將 isas 運算子用於指標型別(CS0244)。 這些類型測試運算子對指標無效。
  • 請勿使用 new 運算子來建立指標類型實例 (CS1919)。 若要在非受控記憶體中建立物件,請使用互通性來呼叫傳回指標的原生方法。
  • 將不安全的程式碼與非同步程式碼分開 (CS4004)。 為不安全的作業建立個別的方法,並從非同步方法呼叫它們。
  • 請勿在非同步方法中的參數或區域變數上使用位址運算子(&)(CS9123)。 非同步作業完成時,變數可能不存在。

固定大小緩衝區

  • CS1641固定大小緩衝區欄位必須在欄位名稱之後具有陣列大小指定元
  • CS1642固定大小的緩衝區欄位只能是結構的成員
  • CS1663固定大小緩衝區類型必須是下列其中一種:bool、位元組、short、int、long、char、sbyte、ushort、uint、ulong、float 或 double
  • CS1665固定大小緩衝區的長度必須大於零
  • CS1666您無法使用未固定運算式中包含的固定大小緩衝區。嘗試使用 fixed 陳述式
  • CS1708固定大小緩衝區只能透過區域變數或欄位存取
  • CS1716請勿使用 'System.Runtime.CompilerServices.FixedBuffer' 屬性。請改用「固定」欄位修飾符

當您使用固定大小的緩衝區時,會發生這些錯誤。 固定大小緩衝區是直接內嵌在結構中的陣列,主要用於互操作案例。 如需詳細資訊,請參閱 固定大小緩衝區

若要正確宣告及使用固定大小緩衝區:

  • 使用正整數常數 (CS1641CS1665) 指定欄位名稱之後的陣列大小。
  • 只在結構中宣告固定大小的緩衝區,而不是在類別中宣告 (CS1642) 。 如果您需要類別中的欄位,請使用常規陣列。
  • 使用其中一個支援的元素類型:boolbyteshortintlongcharsbyteushortuintulongfloatdoubleCS1663)。
  • 在存取緩衝區之前,使用 fixed 陳述式先鎖定包含的結構體(CS1666)。
  • 只能透過局部變數或欄位存取固定大小的緩衝區,而不是透過中間運算式 (CS1708) 。
  • 使用 fixed 欄位修飾元,而不是 System.Runtime.CompilerServices.FixedBuffer 屬性 (CS1716)。

函式指標

  • CS8812無法將群組轉換 &Method 成非函式指標類型

若要取得函式指標,請使用 address-of 運算子搭配明確函式指標類型轉換。 請勿使用 address-of 運算子 & 將方法群組指派給 void* 或其他非函式指標類型。 如需詳細資訊,請參閱 函式指標