【问题标题】:C#: Nonzero-based arrays are not CLS-compliantC#:基于非零的数组不符合 CLS
【发布时间】:2010-10-31 15:24:01
【问题描述】:

我目前正在阅读 AlbahariC# 3.0 in a Nutshell 和 pg。 241,在谈到数组索引时,他说:

基于非零的数组不是 符合 CLS(通用语言规范)

非零数组不符合CLS究竟是什么意思?它对您的代码有什么影响?

[更新]

Here 是指向本书页面的链接。

【问题讨论】:

  • 其他我觉得已经充分回答了这个问题。如果您想在代码中使用 CLSCompliance - 尝试使用 CLSCompliant 属性 - msdn.microsoft.com/en-us/library/…
  • 说起来有点奇怪,尽管在页面其余部分的上下文中可能更有意义。没有明显的方法可以在 C# 中创建一个从零开始的数组,那么为什么要提到它不符合 CLS 呢?
  • 艾瑞克,我现在在帖子里贴了指向书中页面的链接

标签: c# arrays cls-compliant


【解决方案1】:

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

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

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

此类型符合 CLS,因为它包含两个名称仅在类型上有所不同的成员。由于 VB.NET 编译器不区分大小写,使用 VB.NET 的人如何区分 Barbar

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

【讨论】:

  • 感谢您的解释和示例。
【解决方案2】:

CLS 合规性主要是为了确保您的代码尽可能广泛地与其他语言兼容。它包括诸如不公开仅区分大小写的公共成员之类的内容(这会使 VB 混淆,它不区分大小写)。有关更多信息,请参阅此 MSDN article 以及 common language specification 本身。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      还有,

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

      但是这里的其他 cmets 在开发泛型类库时是正确的。

      使用 [assembly:CLSCompliant(true)] 始终是一种好习惯,但这对于让您的应用程序运行并不重要。

      【讨论】:

      • 约翰说这是为了遵守其他语言。我说过,如果您的应用程序是独立的应用程序,则没有必要修复此警告。我认为约翰没有这么说,因此留下了评论。否则,作者可能会开始不必要地检查应用程序,使其合规。
      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      相关资源
      最近更新 更多