指令語法
#error 錯誤訊息文字
#warning 警告訊息文字
#error:導致建置失敗,視為編譯錯誤 (CS1029)
#warning:產生編譯警告 (CS1030),建置繼續
- 訊息文字為自由字串,無需引號
- 常搭配
#if 條件觸發
經典應用場景
1. 互斥建置配置防護
#define DEBUG
#define RELEASE
#define DEMO_VERSION
#if DEMO_VERSION && !DEBUG
#warning 您正在建置 Demo 版本 (非 Debug 模式)
#endif
#if DEBUG && DEMO_VERSION
#error 無法建置 Debug 版 Demo 版本 (邏輯衝突:Demo 應為 Release)
#endif
2. 強制框架版本需求
#if !NET6_0_OR_GREATER
#error 此專案需要 .NET 6.0 或更新版本
#endif
3. 標記未完成/過時功能
#if LEGACY_API
#warning LEGACY_API 將於 v3.0 移除,請遷移至 NewApi
#endif
#if EXPERIMENTAL_FEATURE
#error EXPERIMENTAL_FEATURE 尚未完成,禁止發布建置
#endif
4. 組態驗證
#if !CONNECTION_STRING_DEFINED
#error 專案屬性必須定義 CONNECTION_STRING_DEFINED 條件編譯符號
#endif
與 ConditionalAttribute 比較
| 特性 | #error/#warning | [Conditional] |
| 作用層級 | 建置時期 (原始碼層級) | 建置時期 (方法呼叫層級) |
| 效果 | 阻止/警告建置 | 移除方法呼叫與參數評估 |
| 適用範圍 | 任何程式碼區塊 | 僅方法 |
| 參數副作用 | 不影響 | 參數運算式完全不執行 |
最佳實踐
- 訊息文字具體、可執行:說明衝突原因、建議修正動作
- 配合 CI/CD:
#error 讓錯誤配置在建置階段即失敗,不進入部署
- 避免濫用:核心邏輯驗證用單元測試,
#error 專用於建置配置層級約束
- 團隊約定:在專案 README 記錄所有條件編譯符號含義與互斥規則
實際建置輸出範例
> dotnet build
Demo.cs(10,5): warning CS1030: 您正在建置 Demo 版本 (非 Debug 模式)
Demo.cs(14,5): error CS1029: 無法建置 Debug 版 Demo 版本 (邏輯衝突:Demo 應為 Release)
Build FAILED.
- 上一篇文章: C# 條件編譯完整指南:#define、#if/#elif/#else/#endif、#error/#warning 實戰
- 下一篇文章: C# 條件編譯指令詳解:#if、#elif、#else、#endif 巢狀與邏輯運算
Copyright ©
程式碼之家 All Rights Reserved