我目前正在阅读Albahari的 C# 3.0 in a Nutshell和 pg。241,在谈到数组索引时,他说:
基于非零的数组不符合 CLS(通用语言规范)
非零数组不符合CLS究竟是什么意思?它对您的代码有什么影响?
[更新]
这是本书页面的链接。
我目前正在阅读Albahari的 C# 3.0 in a Nutshell和 pg。241,在谈到数组索引时,他说:
基于非零的数组不符合 CLS(通用语言规范)
非零数组不符合CLS究竟是什么意思?它对您的代码有什么影响?
[更新]
这是本书页面的链接。
CLS(通用语言规范)为一组通用的合规性规则奠定了基础,确保其他语言(VB.NET、F# 等)可以使用您使用 C# 构建的程序集。非零基数组将不兼容,因为其他语言期望数组是从零开始的。
这是一个更容易理解的例子:
class Foo
{
public void Bar() { }
public void bar() { }
}
此类型不符合 CLS,因为它包含两个名称仅按类型不同的成员。由于 VB.NET 编译器不区分大小写,因此使用 VB.NET 的人如何区分Bar
和?bar
所以基本上 CLS 是一堆这样的规则来保证语言之间的互操作性。
除了已经说过的内容之外,基于非零的数组的存在只是为了简化现有 VB6 代码(主要通过自动迁移工具)的转换,因为在 VB6 中,数组索引可以从任意数字开始,不一定是零。
由于 CLS 合规性问题(和其他考虑),不建议在 .NET 中使用它们(即使在编程 VB.NET 时)。此外,它们的使用受到相当的限制。通过将数组封装在类中并编写适当的索引访问运算符来进行偏移转换会更容易。
还,
如果您的应用程序不打算与其他程序一起使用 - 因为它是一个独立的单元,您不会将其作为公共类库出售给其他人,请不要太担心。
但是这里的其他评论在开发泛型类库时是正确的。
It is always good practice to use [assembly:CLSCompliant(true)], but it isn't critical to getting your application running.