Common Language Specification (CLS) 定義了 .NET 語言互操作的「最大公約數」。編寫程式庫若忽視 CLS,將導致 VB.NET、F#、IronPython 等語言無法正常呼叫你的公開 API。
[assembly: CLSCompliant(true)] // AssemblyInfo.cs
編譯器將檢查所有 public/protected 型別與成員:
uint, sbyte, 指標、無符號陣列)出現在公開簽名out/ref 差異public class Person {
private uint _age; // uint 非 CLS 合規
public uint Age { get { return _age; } } // 公開屬性暴露 uint
}
編譯警告:Type of 'Age' is not CLS-compliant。
class InternalHelper { // internal,非公開合約
private uint _cacheSize; // 允許
public uint CacheSize { get; set; } // 允許
}
編譯器**不檢查** internal/private 成員。合規邊界 = 組件可見性邊界。
public class Person {
private uint _age;
[CLSCompliant(false)]
public uint Age { get { return _age; } } // 標記非合規
public int AgeInt32 { get { return (int)_age; } } // 提供合規替代
}
| 場景 | 建議 |
|---|---|
| 公開 NuGet 套件、企業共享程式庫 | **強制合規** |
| 內部專案、單一語言團隊 | 可放寬,但建議核心域模型合規 |
| 高效能數值運算、互操作原生代碼 | 核心用非合規型別,對外包裝合規介面 |
CLS 合規非強制,但專業程式庫的基本禮儀。一行 [assembly: CLSCompliant(true)],為你的代碼贏得跨語言通用的通行證。