本文涵蓋下列編譯器錯誤:
- 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:固定大小緩衝區類型必須是下列其中一項:
bool、byte、或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運算子unsafe(CS0233)。
固定緩衝區
- 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陳述式中使用var(CS0821)。 - 請勿指派給唯讀內容中的變數,例如
foreach迴圈、using陳述式或fixed陳述式 (CS1656)。
不安全環境限制
- CS0214: 指標和固定大小緩衝區只能在不安全的內容中使用
- CS0227: 只有在使用 /unsafe 編譯時,才會出現不安全的程式代碼
- CS0244: 'is' 和 'as' 在指標類型上都無效
- CS1919: 不安全的類型 'type name' 無法用於物件建立
- CS4004: 無法在不安全的環境中等待
- CS9123: 不應該在非同步方法中的參數或區域變數上使用 '&' 運算子
當您使用不安全的程式碼建構而沒有適當的不安全內容,或嘗試不安全程式碼中不允許的作業時,就會發生這些錯誤。 如需詳細資訊,請參閱 不安全的程式代碼和指標 以及 unsafe 關鍵字。
若要正確使用不安全的程式碼:
- 使用關鍵字 (
unsafe) 標示使用指標或固定大小緩衝區的方法、類型或程式碼區塊。 - 使用關鍵字 (CS0227) 時,請在專案設定中啟用
unsafe編譯器選項。 - 請勿將
is或as運算子用於指標型別(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' 屬性。請改用「固定」欄位修飾符
當您使用固定大小的緩衝區時,會發生這些錯誤。 固定大小緩衝區是直接內嵌在結構中的陣列,主要用於互操作案例。 如需詳細資訊,請參閱 固定大小緩衝區。
若要正確宣告及使用固定大小緩衝區:
- 使用正整數常數 (CS1641、 CS1665) 指定欄位名稱之後的陣列大小。
- 只在結構中宣告固定大小的緩衝區,而不是在類別中宣告 (CS1642) 。 如果您需要類別中的欄位,請使用常規陣列。
- 使用其中一個支援的元素類型:
bool、byte、shortintlongcharsbyteushortuintulongfloat或double(CS1663)。 - 在存取緩衝區之前,使用
fixed陳述式先鎖定包含的結構體(CS1666)。 - 只能透過局部變數或欄位存取固定大小的緩衝區,而不是透過中間運算式 (CS1708) 。
- 使用
fixed欄位修飾元,而不是System.Runtime.CompilerServices.FixedBuffer屬性 (CS1716)。
函式指標
-
CS8812: 無法將群組轉換
&Method成非函式指標類型
若要取得函式指標,請使用 address-of 運算子搭配明確函式指標類型轉換。 請勿使用 address-of 運算子 & 將方法群組指派給 void* 或其他非函式指標類型。 如需詳細資訊,請參閱 函式指標。