CLS允许类中的代码的私有部分不符合CLS。这怎么可能?

时间:2010-05-29 10:01:21

标签: c# .net

CLS允许类中代码的私有部分不符合CLS。这怎么可能,因为最终需要将代码转换为IL?

4 个答案:

答案 0 :(得分:7)

CLS代表公共语言规范。为了简化,它基本上是所有.NET语言必须知道的最小类型和标识符。例如,Int32符合CLS:任何.NET语言都必须能够处理它。 UInt32不是。由于您的代码是私有的,因此其他语言的其他程序集不会访问它,因此它与CLS兼容无关紧要。

有关CLS合规性的详细信息,请参阅this MSDN page

编辑:我认为您误解了CLS的合规性。这不是关于代码是否可以编译成IL。 UInt32可以在IL中使用。名为“©”的标识符也是如此。 CLS合规性只是语言互操作性的最小合同。 CLR支持的内容比CLS合规性的限制更广泛。

编辑2:是的,你是对的。即使有直接映射到IL,也需要.NET语言来支持Int32而不是UInt32。请参阅指针,它们在IL和C#中受支持,但不符合CLS。 VB.NET没有实现对它们的支持,仍然符合CLS。

答案 1 :(得分:2)

不 - CLR不需要知道引擎盖下发生了什么。您只需要让这些公共类的公共类和公共/私有成员符合CLS,永远不会访问其他代码 - 使用您的类的其他语言将无法访问它。

答案 2 :(得分:1)

CLS的唯一真正目标是确保任何兼容语言能够与任何兼容类进行交互,无论其编写的语言如何,因此根据定义,该类的API仅需要所有语言必须支持的内容。因此,“共同语言规范”。

很明显,私有API在您自己的代码之外是(或者至少应该是)不可见的,因此它是否符合CLS并不重要。

答案 3 :(得分:1)

如果它符合CLS,则意味着每个 .NET语言必须支持它。
如果它在IL中可表示意味着某些 .NET语言可能支持它。

一个代表.NET语言的要求,另一个代表.NET语言的可能性。