你可以在任何 CLS 相容類別中實作它。然而,若在未標記 CLS 相容的組件中定義此介面,則此 IFoo 介面並非 CLS 相容。即介面僅滿足 CLS 規範不夠,必須定義在 CLS 相容組件中才是 CLS 相容。原因在編譯器:編譯器只在組件標記 CLS 相容時檢查 CLS 相容型別。類似地,編譯器總假設在 CLS 不相容組件中定義的型別實際上都是 CLS 不相容。然而,此介面成員具有 CLS 相容性標記。即使 IFoo 未標記 CLS 相容,你也可在 CLS 相容類別中實作此介面。此類別客戶可透過類別引用存取 DoStuff,而非 IFoo 介面引用。
考慮簡單參數:
public interface IFoo2 { void DoStuff(UInt32 arg1, string arg2); }
公開實作 IFoo2 的類別與 CLS 不相容。為讓類別同時實作 IFoo2 且 CLS 相容,必須用明確介面定義:
public class MyClass : IFoo2
{
void IFoo2.DoStuff(UInt32 arg1, string arg2) { /* content */ }
}
MyClass 有 CLS 相容介面,想存取 IFoo2 的客戶必須透過 CLS 不相容的 IFoo2 介面指標。
還沒相容。建立 CLS 相容型別要求所有公用與受保護介面只包含 CLS 相容型別。即某類別基類也必須 CLS 相容。所有實作介面也必須 CLS 相容。若實作 CLS 不相容介面,必須實作明確介面定義,從公用介面隱藏它。
CLS 相容性不強迫你用最小公用名稱實現設計。只是告訴你應小心使用組件上公用介面。對任何公用或受保護類別,建構函數中涉及的任何型別必須 CLS 相容,包含:
編譯器嘗試強制相容一個組件,讓提供最小層級 CLS 相容變簡單。再稍加小心,可建立其他語言都可用的組件。編譯器規範試圖確保不犧牲你喜歡語言結構就可盡可能與其他語言相容。只需在介面中提供可選方案。
CLS 相容性要求你花時間站在其他語言考慮公用介面。不必限制所有程式碼 CLS 相容,只需避免介面中不相容結構。通用語言互操作值得你花時間。