CLS允許類中的代碼的私有部分不符合CLS。這怎麼可能,因爲最終代碼需要轉換爲IL?CLS允許類中的代碼的私有部分不符合CLS。這怎麼可能?
回答
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。
我的理解是:如果某些東西是CLS兼容的,那麼這是因爲IL支持它,因爲編譯時所有東西都會轉換爲IL。當UInt32不符合CLS標準時,無論它是在私有實現中還是在公共中,它有什麼關係,因爲它不會被編譯爲IL? – teenup 2010-05-30 05:56:29
對不起,我想我在問一些荒謬的問題,但是如果UInt32被CTS支持(即由IL也支持),那麼爲什麼他們已經使它不符合CLS?也就是說,如果我用一種語言從我的某個方法中返回一個UInt32,那麼爲什麼其他語言不能調用此方法並接受返回值?另一種語言可以不直接使用System.UInt32,並且不需要其編譯器支持將映射到UInt32的數據類型。網絡框架? – teenup 2010-05-30 17:18:32
否 - CLR不需要知道引擎蓋下發生了什麼。你只需要你的公共類和這些公共類的公共/私有成員符合CLS,其他代碼將永遠不會被訪問 - 其他使用你的類的語言將無法訪問。
例如變量在visual basic中區分大小寫,並且我只用兩個帶有大小寫差異的變量,這不符合cls並將它們放在私有函數的範圍內。現在,當我運行我的應用程序時,它將被轉換爲IL。 現在,當IL不支持僅具有案例差異的變量時,這兩個差異變量將被視爲單個相同變量。 – teenup 2010-05-29 10:27:24
CLS說,代碼不應該公開任何僅在他們的情況下不同的兩個名稱(標識符)。而VB.Net編譯器不會讓你編譯源代碼 - 「局部變量已經在當前塊中聲明瞭。」# – 2010-05-29 10:40:01
@Pundeet我認爲你的意思是VB是case **不敏感**。在VB中聲明只有在相同範圍內纔會有不同情況的變量,就像this._curious_geek指出的那樣,會導致編譯錯誤。 – 2011-09-09 01:31:28
CLS的唯一的真正的目標是確保任何兼容的語言能夠與任何兼容的類交互,而不管這是寫在語言,導致根據定義類的API只要求所有的語言都必須支持的事情。因此,「通用語言規範」。
半顯然,私有API是(或者至少應該是)自己的代碼外面看不見,所以也無所謂它是否符合CLS與否。
如果它符合CLS則表示每 .NET語言必須支持它。
如果是在IL可表示這意味着一些 .NET語言可能支持它。
一個代表.NET語言的需求,另一個代表.NET語言中可能的東西。
- 1. 爲什麼這不符合CLS?
- 2. 類型的成員是不符合CLS
- 3. 爲什麼我的課不符合CLS?
- 4. 爲什麼我的代碼不符合CLS?
- 5. .NET中符合NON-CLS的代碼的後果是什麼?
- 6. LINQ to SQL類不符合CLS?
- 7. 參數類型'FluentNHibernate.Mapping.IProperty'不符合CLS
- 8. 爲什麼unsigned int不符合CLS?
- 9. 我爲什麼要編寫符合CLS的代碼?
- 10. 從WSDL生成的代理類具有符合CLS的錯誤
- 11. 爲什麼我的功能不符合CLS?
- 12. 包含非CLS兼容引用的程序集是否可以符合CLS?
- 13. 爲什麼帶有下劃線的名稱不符合CLS?
- 14. 我如何在.NET代碼中找到所有不符合CLS的聲明?
- 15. 參數類型不符合CLS,爲什麼?
- 16. 爲什麼這個CLS不兼容?
- 17. 使用枚舉是不符合CLS
- 18. 如何驗證F#代碼是否符合CLS
- 19. Python:當cls不是float時,爲什麼會浮動.__ new __(cls)?
- 20. 爲什麼我的MEF使用不符合CLS?
- 21. java.lang.class <Cls>和Cls之間的區別是什麼?
- 22. 如何在符合CLS裝配
- 23. .NET Framework:參數類型'uint'在P/Invoke上不符合CLS
- 24. 獲取「參數類型'StreamSocket'不符合CLS」構建
- 25. 瞭解CLS合規性和正確的代碼
- 26. Sympy符號和cls參數
- 27. Python類繼承,__init__和cls
- 28. BASH中的「CLS」等效嗎?
- 29. 的EventArgs(Of T)已被標記爲不符合CLS
- 30. VS 2010名稱不符合CLS的錯誤
按照定義,私人成員不能被任何其他類訪問,包括那些用其他語言編寫的類,所以它們不需要符合CLS。 – 2011-09-09 01:39:45