2010-05-29 32 views

回答

7

CLS代表通用語言規範。爲了簡化,它基本上是所有.NET語言必須知道的最小類型和標識符。例如,Int32是符合CLS的:任何.NET語言都必須能夠處理它。 UInt32不是。由於您的代碼是私有的,因此其他語言的其他程序集不會訪問它,因此無論是否符合CLS,都無關緊要。

有關符合CLS的更多信息,請參閱this MSDN page

編輯:我想你誤會合規是什麼CLS。這與代碼是否可以編譯到IL中無關。 UInt32可以在IL中使用。那麼名爲「©」的標識符也是如此。 CLS合規性只是語言互操作性的最低合同。 CLR支持的範圍比CLS遵從的限制要寬泛得多。

EDIT2:是的,你說得對。即使直接映射到IL,.NET語言也需要支持Int32,而不是UInt32。請參閱指針,它們在IL和C#中受支持,但不符合CLS。 VB.NET不支持它們,仍然符合CLS。

+0

我的理解是:如果某些東西是CLS兼容的,那麼這是因爲IL支持它,因爲編譯時所有東西都會轉換爲IL。當UInt32不符合CLS標準時,無論它是在私有實現中還是在公共中,它有什麼關係,因爲它不會被編譯爲IL? – teenup 2010-05-30 05:56:29

+0

對不起,我想我在問一些荒謬的問題,但是如果UInt32被CTS支持(即由IL也支持),那麼爲什麼他們已經使它不符合CLS?也就是說,如果我用一種語言從我的某個方法中返回一個UInt32,那麼爲什麼其他語言不能調用此方法並接受返回值?另一種語言可以不直接使用System.UInt32,並且不需要其編譯器支持將映射到UInt32的數據類型。網絡框架? – teenup 2010-05-30 17:18:32

2

否 - CLR不需要知道引擎蓋下發生了什麼。你只需要你的公共類和這些公共類的公共/私有成員符合CLS,其他代碼將永遠不會被訪問 - 其他使用你的類的語言將無法訪問。

+0

例如變量在visual basic中區分大小寫,並且我只用兩個帶有大小寫差異的變量,這不符合cls並將它們放在私有函數的範圍內。現在,當我運行我的應用程序時,它將被轉換爲IL。 現在,當IL不支持僅具有案例差異的變量時,這兩個差異變量將被視爲單個相同變量。 – teenup 2010-05-29 10:27:24

+0

CLS說,代碼不應該公開任何僅在他們的情況下不同的兩個名稱(標識符)。而VB.Net編譯器不會讓你編譯源代碼 - 「局部變量已經在當前塊中聲明瞭。」# – 2010-05-29 10:40:01

+0

@Pundeet我認爲你的意思是VB是case **不敏感**。在VB中聲明只有在相同範圍內纔會有不同情況的變量,就像this._curious_geek指出的那樣,會導致編譯錯誤。 – 2011-09-09 01:31:28

1

CLS的唯一的真正的目標是確保任何兼容的語言能夠與任何兼容的類交互,而不管這是寫在語言,導致根據定義類的API只要求所有的語言都必​​須支持的事情。因此,「通用語言規範」。

半顯然,私有API是(或者至少應該是)自己的代碼外面看不見,所以也無所謂它是否符合CLS與否。

1

如果它符合CLS則表示 .NET語言必須支持它。
如果是在IL可表示這意味着一些 .NET語言可能支持它。

一個代表.NET語言的需求,另一個代表.NET語言中可能的東西。