【问题标题】:Argument type is not CLS-compliant, why?参数类型不符合 CLS,为什么?
【发布时间】:2020-07-09 19:02:35
【问题描述】:

我收到这样的警告 如果您知道它是什么,请解释并帮助我摆脱它。 南。

【问题讨论】:

  • INotificationService 是什么样的?

标签: c#


【解决方案1】:

在您的 AssemblyInfo.cs 文件中,您可能有一行显示

[assembly:CLSCompliant(true)]

如果这样做,则必须满足以下规则。 (从http://www.devarticles.com/c/a/C-Sharp/Making-Your-Code-CLS-Compliant/复制-Pasta)

  1. 无符号类型不应该是类的公共接口的一部分。这意味着公共字段不应具有像 uint 或 ulong 这样的无符号类型,公共方法不应返回无符号类型,传递给公共函数的参数不应具有无符号类型。但是,无符号类型可以是私有成员的一部分。

  2. 像指针这样的不安全类型不应该与公共成员一起使用。但是它们可以与私有成员一起使用。

  3. 类名和成员名不应仅因大小写而异。例如,我们不能有两个名为 MyMethod 和 MYMETHOD 的方法。

  4. 只有属性和方法可以重载,运算符不能重载。

【讨论】:

  • 无符号类型可能是公共接口的一部分,如果它们不公开以没有无符号类型的语言编写的代码可能想要使用但无法这样做的任何功能。例如,将 32 位无符号值存储到四个连续字节中的方法可以合法地包含 UInt32Int64 的重载,并且类可以提供将四个连续字节转换为 UInt32 的方法,如果它还提供了一个返回与Int64 相同的值。
【解决方案2】:

这是一个老问题,但我认为应该为未来的调查人员(例如我自己)提供更好的解释。

首先,其他答案中的链接提供了有关发出此警告的原因的详细信息。

但是,总而言之,为公共语言运行时(如 C#)编写的代码如果可以与为 CLR 设计的其他语言交互,则它是符合 CLS 的。这意味着特定于语言的某些数据类型不符合整个运行时的通用性。关于变量和方法的快速简便的解决方法是为它们提供可见性修饰符internal,它指定方法、类、属性等在为其构建的程序集之外不可见。这只应在那些您不需要或不想在装配之外使用的项目上进行;对于那些你想要可见的,使用符合 CLS 的数据类型。

【讨论】:

    【解决方案3】:

    更多信息:

    您可以在符合 CLS 的程序集中获得这些警告,这些警告引用不符合 CLS 的程序集(并公开其不符合 CLS 的成员):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多