在編譯期間載入來源產生器或攔截器時,會產生下列錯誤:
-
CS9137: 未啟用「攔截器」實驗功能。將 新增
<Features>InterceptorsPreview</Features>至您的專案。 - CS9138: 方法無法做為攔截器,因為它或其包含類型具有類型參數。
- CS9139: 無法攔截:編譯不包含具有路徑的檔案。
- CS9140: 無法攔截:編譯不包含路徑的檔案。您的意思是使用不同的路徑嗎?
- CS9141:提供的行和字元編號並非指向可攔截的方法名稱,而是指向一個標記。
-
CS9142: 指定的檔案具有
n行數,小於提供的行號m。 -
CS9143: 指定的行長度為
c字元長,小於提供的字元編號n。 -
CS9144: 無法攔截攔截方法
M與攔截器V,因為簽章不相符。 - CS9145: 無法攔截:路徑未對應。預期的對應路徑。
- CS9146: 攔截器方法必須是一般成員方法。
-
CS9147: 提供的行和字元編號不會參考令牌的開頭。您的意思是使用行
n和字元c嗎? -
CS9148: 攔截器必須具有
this參數比對參數。 -
CS9149: 攔截器不能有
this參數,因為方法沒有this參數。 -
CS9150: 攔截器不能有
null檔案路徑。 -
CS9151: 無法攔截可能的方法名稱
M,因為它未叫用。 - CS9152: 無法攔截具有此路徑的檔案呼叫,因為編譯中的多個檔案具有此路徑。
- CS9153: 指定的呼叫被攔截多次。
-
CS9155:無法使用
M攔截呼叫,因為V內無法存取。 -
CS9156:由於 'scoped' 修飾詞或
M屬性之間的差異,無法攔截V的[UnscopedRef]呼叫。 -
CS9157: 提供給 的
InterceptsLocationAttribute行號和字元數必須是正數。 - CS9160: 無法攔截 nameof 運算符。
-
CS9161:攔截器不能使用
UnmanagedCallersOnlyAttribute進行標記。 - CS9177:攔截器必須是非泛型或具有相符的參數數目。
- CS9178: 方法必須是非泛型才能比對
- CS9206: 無法在全域命名空間中宣告攔截器。
- CS9207: 無法攔截,因為方法不是一般成員方法的調用。
- CS9231: InterceptsLocationAttribute 的資料引數格式不正確。
- CS9232: 攔截器格式的版本「version」不受支援。最新支援的版本是「1」。
- CS9233: 無法攔截檔案 'file' 中的呼叫,因為它在編譯中的其他位置重複。
- CS9234: 無法攔截檔案 'file' 中的呼叫,因為在編譯中找不到相符的檔案。
- CS9235: InterceptsLocationAttribute 的資料引數會參考檔案 'file' 中的無效位置。
在編譯期間載入來源產生器或攔截器時,會產生下列警告:
-
CS8784: 產生器 '
YourSourceGeneratorName' 無法初始化。這不會造成輸出,而且編譯錯誤可能會因此發生。 -
CS8785: 產生器 '
YourSourceGeneratorName' 無法產生來源。這不會造成輸出,而且編譯錯誤可能會因此發生。 - CS9057: 分析 器組合語言無法使用,因為它參考的是比目前版本更新的編譯器版本。
- CS9067:分析器參考被多次指定。
-
CS9154:使用攔截器
M攔截對V的呼叫,但簽章不相符。 - CS9158:函式的回傳型別中參考型別的可空性與可攔截的方法不一致。
- CS9159:參數類型中參考型別的可空性與可攔截方法不相符。
-
CS9270: 不支援 '
InterceptsLocationAttribute(string, int, int)'。請改為移至以 『InterceptableLocation』 為基礎的這些屬性產生。 (https://github.com/dotnet/roslyn/issues/72133)
這些錯誤和警告會遵循下列主題:
攔截器是實驗性的
-
CS9137: 未啟用「攔截器」實驗功能。將 新增
<Features>InterceptorsPreview</Features>至您的專案。
要使用 interceptors,請在您的專案文件中的 <Features>InterceptorsPreview</Features> 區段內加入 <PropertyGroup> 元素,因為 interceptors 是一項實驗性功能,並未預設啟用。 此明確選擇加入是因為攔截器功能未來版本可能會有破壞性變更或移除,編譯器需確認您了解風險後才允許使用。 欲了解更多攔截機及其能力,請參閱 C# 12 功能文件中的 攔截機 。
簽章不符
以下錯誤與警告顯示攔截方法與可攔截方法不匹配。
-
CS9144: 無法使用攔截器
M攔截方法V,因為簽章不相符。 -
CS9148: 攔截器必須具有
this參數比對參數。 -
CS9149: 攔截器不能有
this參數,因為方法沒有this參數。 -
CS9155:無法攔截
M呼叫,因為它無法在V中存取。 -
CS9156:由於'scoped' 修飾詞或
M屬性的差異,所以無法攔截 對V[UnscopedRef]的呼叫。 - CS9177]: 攔截器必須是非泛型或具有相同的元數。
- CS9178: 方法必須是非泛型才能比對
此外,下列警告表示攔截器和可攔截方法簽章不符:
-
CS9154:使用攔截器
M攔截對V的呼叫,但簽章不相符。 - CS9158:傳回類型中參考型別的 Null 性不符合可攔截的方法。
- CS9159: 參數類型中參考型別的 null 能力與可攔截方法不相符。
-
CS9270: 不支援 '
InterceptsLocationAttribute(string, int, int)'。請改為移至以 『InterceptableLocation』 為基礎的這些屬性產生。 (https://github.com/dotnet/roslyn/issues/72133)
為解決這些問題,請確保您的攔截方法與可攔截方法的簽名及存取需求相符:
- 確保攔截方法的特徵與可攔截方法(CS9144、 CS9154)完全一致。 參數類型、修飾符、順序與返回類型必須相同。 檢視兩個方法宣告並對齊其簽名。
- 當攔截方法為實例方法時,為攔截器新增
this參數(CS9148),若攔截方法是靜態,則移除this參數(CS9149)。 實例攔截器需要this宣告型態的參數,而靜態攔截器則不需具備參數。 - 將攔截器設置於可攔截方法可取得的位置(CS9155)。 若攔截方法是
internal,攔截器必須在同一組件中。 如果是private,攔截器必須是同一類型或巢狀型。 - 請將
scoped修飾詞與[UnscopedRef]屬性匹配到相應的ref參數(CS9156)。 攔截器中的每個ref參數必須與可攔截方法中相應參數具有相同的壽命註解,以確保記憶體安全。 - 確保兩種方法的通用元數相符(CS9177、 CS9178)。 若截獲方法是非通用的,攔截器也必須是非通用的。 若可截距方法有型別參數,攔截器必須擁有相同數量且約束相容的型別參數。
- 在回傳類型(CS9158)和參數類型(CS9159)中匹配空性註解。 在您的專案中啟用可空參考型別,並確保攔截器的空可性註解與截獲方法完全一致,以維持型別安全。
- 使用基於
InterceptableLocation的更新後生成以取代已棄用的InterceptsLocationAttribute建構器((string, int, int))中的 。 較新的格式提供更好的工具支援與編譯時的驗證。 遷移指引請參見 GitHub 議題 。
不正確的對應
攔截器需要一個來源映射,該映射對應可攔截的方法和攔截器的方法。 下列錯誤表示對應有問題:
- CS9139: 無法攔截:編譯不包含具有路徑的檔案。
- CS9140: 無法攔截:編譯不包含路徑的檔案。您的意思是使用不同的路徑嗎?
- CS9141: 提供的行和字元編號不是指涉可攔截的方法名稱,而是指涉標籤。
-
CS9142: 指定的檔案具有
n行數,小於提供的行號m。 -
CS9143: 指定的行長度為
c字元長,小於提供的字元編號n。 - CS9145: 無法攔截:路徑未對應。預期的對應路徑。
-
CS9147: 提供的行和字元編號不會參考令牌的開頭。您的意思是使用行
n和字元c嗎? -
CS9150: 攔截器不能有
null檔案路徑。 -
CS9157: 提供給 的
InterceptsLocationAttribute行號和字元數必須是正數。
要修正映射錯誤,請確保你的 InterceptsLocationAttribute 檔案路徑有效且位置資訊正確:
- 確認檔案路徑是否完全符合你彙編中的檔案(CS9139、 CS9140)。 請使用在您的專案中出現的精確路徑,包括正確的大小寫和目錄分隔符。 如果編譯器建議替代路徑,就更新你的屬性以使用該路徑。
- 使用轉換檔案路徑的源產生器時,請使用映射檔案路徑(CS9145)。 原始碼產生器經常會重新映射產生檔案的路徑,你必須使用編譯器能辨識的映射路徑,而非原始原始碼路徑。
- 請確保在您的
null(InterceptsLocationAttribute)中,檔案路徑不是 。 每次攔截必須指定一個有效且非空的檔案路徑,以識別包含攔截呼叫的來源檔案。 - 提供正數、以 1 為基礎的行號和字元號碼(CS9157)。 行號和字元位置必須從1開始,而非0。 請確認你的來源產生器在計算位置時是否使用基於 1 的索引。
- 指向方法名稱標記的精確起始點(CS9141, CS9147)。 行號與字元號必須識別呼叫中方法名稱的第一個字元,而非空白、運算子或其他標記。 如果編譯器建議替代座標,利用這些來鎖定正確的標記起始點。
- 請遵守檔案範圍(CS9142、 CS9143)。 確認行數沒有超過總行數,字元數也沒有超過行長。 如果來源檔案自屬性產生以來有變動,請重新計算位置。
攔截器聲明不正確
下列錯誤指出攔截器宣告的問題,包括格式問題 InterceptsLocationAttribute 或違反攔截器規則:
- CS9138: 方法無法做為攔截器,因為它或其包含類型具有類型參數。
- CS9146: 攔截器方法必須是一般成員方法。
-
CS9151: 無法攔截可能的方法名稱
M,因為它未叫用。 - CS9152: 無法攔截具有此路徑的檔案呼叫,因為編譯中的多個檔案具有此路徑。
- CS9153: 指定的呼叫被攔截多次。
- CS9160: 無法攔截 nameof 運算符。
-
CS9161: 攔截器無法被標示為
UnmanagedCallersOnlyAttribute。 - CS9206: 無法在全域命名空間中宣告攔截器。
- CS9207: 無法攔截,因為方法不是一般成員方法的調用。
- CS9231: InterceptsLocationAttribute 的資料引數格式不正確。
- CS9232: 攔截器格式的版本 'version' 不被支援。目前最新支援的版本是「1」。
- CS9233: 無法攔截檔案 'file' 中的呼叫,因為它在編譯中的其他位置重複。
- CS9234: 無法攔截檔案 'file' 中的呼叫,因為在編譯中找不到相符的檔案。
- CS9235: InterceptsLocationAttribute 的資料引數會參考檔案 'file' 中的無效位置。
要糾正攔截機宣告錯誤,請遵循以下有效攔截機宣告與 InterceptsLocationAttribute 使用規則:
- 請正確格式化
InterceptsLocationAttribute資料參數(CS9231)。 屬性需要特定的結構化資料來編碼檔案路徑與位置資訊。 確保你的來源產生器產生的資料格式符合目前攔截器規格。 - 請在你的
InterceptsLocationAttribute(CS9232)中使用版本 '1',因為它是最新支援的版本。 更新你的原始碼產生器,讓它輸出版本 1 的格式屬性,而不是不支援的版本號。 - 確保你的編譯中有唯一的檔案路徑(CS9233、 CS9234)。 當編譯包含重複的檔案路徑時,請重新命名或重新組織檔案,使每條路徑都獨一無二。 確認屬性中的檔案路徑是否與編譯中實際包含的檔案相符。
- 驗證位置數據點是否指向有效的程式碼位置(CS9235)。 行號與字元號必須參考指定檔案內的有效攔截點。 如果來源檔案有變動或位置超出檔案範圍,則重新產生屬性。
- 以非通用類型(CS9138)宣告非通用攔截方法。 攔截器不能在方法本身或包含的型別上設定型別參數。 如果你需要攔截通用方法,就建立一個非通用攔截器,能與特定構造型態相容。
- 讓攔截器成為普通成員方法(CS9146)。 攔截器不能是運算子、建構子、終結器、屬性或索引器。 將攔截器宣告為一般靜態或實例方法。
- 攔截實際方法調用,而非表達式(CS9151, CS9207)。 你只能攔截正在調用的普通成員方法的呼叫。 你無法攔截方法群組、代理或被引用的方法而不被呼叫。 確保可攔截的位置能識別實際的方法呼叫。
- 移除重複攔截嘗試(CS9153)。 每個方法呼叫只能攔截一次。 如果多個
InterceptsLocationAttribute實例針對同一通話,則移除除一個外的所有實例以解決歧義。 - 不要攔截
nameof操作員(CS9160)。nameof運算子在執行時不會呼叫方法,因此無法被攔截。 僅攔截於運行時執行的實際方法呼叫。 - 從攔截機(
UnmanagedCallersOnlyAttribute)中移除。 攔截器必須可從管理程式碼呼叫,且不能被標記為UnmanagedCallersOnlyAttribute。 從你的攔截器方法宣告中移除該屬性。 - 在命名空間(CS9206)內宣告攔截器。 攔截器不能在全域命名空間中宣告,且必須包含在至少一個命名空間宣告中。 把你的攔截機類別包裝在命名空間裡。
- 在編譯層級(CS9152)解決重複檔案路徑。 當多個檔案在編譯中共用相同路徑時,編譯器無法判斷要攔截哪個檔案。 確保建置設定能產生獨特的檔案路徑,或是對原始檔案採用不同的組織策略。
分析儀相容性
以下警告表示分析儀或源產生器組件可能出現問題:
- CS9057:分析器組件無法使用,因為它引用了比當前運行版本更新的編譯器版本。
- CS9067:分析程序參考被多次設定。
這些警告發生在分析儀組件存在相容性問題時:
- 當分析器組件引用比目前版本更新的 Roslyn 編譯器時,會產生 CS9057。 這會阻止分析器載入,因為它可能依賴目前編譯器版本中沒有的 API 或行為。 要解決這個問題,要麼升級你的編譯器/SDK,以符合分析器的需求,要麼使用與你目前編譯器版本相容的分析器版本。
- CS9067 會在專案中多次引用同一個分析儀組件時發出警告。 這通常發生在分析器透過多條路徑或套件參考引入時。 雖然不是錯誤,但重複引用可能會影響建置效能,並可能導致意外行為。 請移除重複引用以解決此警告。