C#:非零的数组不符合CLS

我现在正在阅读Albahari的C#3.0 in a Nutshell and pg。 241,在谈论数组索引时,他说:

基于非零的数组不符合CLS(公共语言规范)

对于非零数组不符合CLS ,这究竟意味着什么? 它对你的代码有什么影响?

[更新]

这是该书页面的链接。

CLS(公共语言规范)为一组通用的合规规则奠定了基础,这些规则保证其他语言(VB.NET,F#等)可以使用您使用C#构建的程序集。 基于非零的数组不符合要求,因为其他语言希望数组从零开始。

这是一个更容易理解的示例:

class Foo { public void Bar() { } public void bar() { } } 

此类型符合CLS,因为它包含两个仅按类型名称不同的成员。 由于VB.NET编译器不区分大小写,因此使用VB.NET的人如何消除Barbar之间的歧义?

所以基本上CLS是一堆这样的规则来保证语言之间的互操作性。

CLS合规性主要是为了确保您的代码与其他语言尽可能广泛兼容。 它包括不公开公共成员的事情,这些公共成员只有大小写(这会混淆VB,这是不区分大小写的)。 有关更多信息,请参阅此MSDN文章以及通用语言规范本身。

除了上述内容之外,基于非零的数组仅用于简化现有VB6代码的转换(主要通过自动迁移工具),因为在VB6中,数组索引可以从任意数字开始,不一定是零。

由于CLS合规性问题(和其他考虑因素),不建议在.NET中使用它们(即使在编写VB.NET时)。 此外,它们的使用受到相当的限制。 通过将数组封装在类中并编写适当的索引访问运算符,可以更轻松地进行偏移转换。

也,

如果您的应用程序不适合与其他程序一起使用 – 因为它是一个独立的单元,您不会将其作为公共类库出售给其他人,请不要过于担心。

但是在开发generics类库时,其他注释是正确的。

使用[assembly:CLSCompliant(true)]总是好的做法,但是让应用程序运行并不重要。