问题标签 [cls-compliant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
8018 浏览

c# - 参考名称案例不符合 CLS

我有一个 .NET 3.5 C# 项目,其命名空间为SampleNamespace.Tools.Sample.

如果我将一个名为“Samplenamespace.Utils.Example”的程序集添加到我的项目中,我会收到以下警告:

标识符“Samplenamespace”仅在不符合 CLS 的情况下有所不同

注意 中的小写“n” Samplenamespace

目前我什至没有在我的项目中使用参考程序集。只需将其添加为参考就会导致警告。

考虑到我什至没有在我的公共类中公开对程序集的任何引用,为什么编译器会抱怨这个?

任何解决方法?

0 投票
4 回答
3843 浏览

c# - C#:基于非零的数组不符合 CLS

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

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

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

[更新]

是本书页面的链接。

0 投票
1 回答
219 浏览

c# - CLSCompliant 属性是否关心旧版本的 .NET 语言?

例如,我读到 Visual Basic .net 之前没有运算符重载,因此如果它们也没有作为普通方法提供(添加,而不是运算符+),则无法使用类型重载运算符。

既然 VB 具有此功能,CLSCompliant 属性是否会关心您是否有普通的静态方法,如 Add、Subtract 而不是仅运算符重载?

我编写了一些没有口头静态方法的类型,但只有运算符重载,C# 编译器不在乎。如果有问题,它会警告我,对吗?

0 投票
2 回答
1602 浏览

c# - 如何在 Web 参考中处理符合 CLS 的问题?

我在我的 C# 解决方案的程序集中打开 [assembly: System.CLSCompliant(true)]。

我现在在为 SharePoint Web 服务生成的代码中收到了一些警告。

这是不符合 CLS 的方法之一:

如何删除此警告?

谢谢你,基思

0 投票
8 回答
57952 浏览

c# - 为什么这个带下划线的名称不符合 CLS 标准?

为什么我会收到编译器警告

标识符“Logic.DomainObjectBase._isNew”不符合 CLS

对于以下代码?

0 投票
4 回答
1217 浏览

vb.net - LINQ to SQL 类不符合 CLS?

我正在使用 LINQ to SQL 作为新项目的数据访问层。我已将我的数据库表添加到设计器中,一切都很好。

每当我在函数中使用这些类之一时,Visual Studio 都会警告我“类型 xxxx 不符合 CLS”或“函数 xxxx 的返回类型不符合 CLS”

这是 LINQ to SQL 生成的类的问题吗?有关系吗?我可以在任何地方禁用这些警告吗?我的 VS 错误列表被这些警告堵塞了,很难看到其他任何东西。

编辑:

抱歉,我应该提到这些是 VB.NET 项目。:)

0 投票
3 回答
2851 浏览

.net - CLSCompliant(true) 拖入未使用的引用

谁能解释以下行为?

总之,如果您在 Visual Studio 2008 中创建多个符合 CLS的库并让它们共享一个公共命名空间根,则引用另一个库的库将需要对该库的引用的引用,即使它不使用它们。

这很难用一句话来解释,但这里有一些重现行为的步骤(密切注意命名空间):

创建一个名为 LibraryA 的库并向该库添加一个类:

[assembly: CLSCompliant(true)]通过添加到 AssemblyInfo.cs确保库符合 CLS 。

创建另一个名为 LibraryB 的库并引用 LibraryA。将以下类添加到 LibraryB:

确保 LibraryB 也符合 CLS。

请注意,Class1InLibraryB 派生自 LibraryA 中的类型,而 Class2InLibraryB 不是。

现在创建名为 LibraryC 的第三个库并引用 LibraryB(但不是 LibraryA)。添加以下类:

这仍然应该编译。请注意, Class1InLibraryC 派生自 LibraryB 中的类,该类不使用 LibraryA 中的任何类型

另请注意,Class1InLibraryC 是在一个命名空间中定义的,该命名空间是 LibraryB 中定义的命名空间层次结构的一部分。

到目前为止,LibraryC 没有对 LibraryA 的引用,并且由于它不使用 LibraryA 中的任何类型,因此解决方案可以编译。

现在也使 LibraryC CLS 兼容。突然,解决方案不再编译,给你这个错误信息:

'Ploeh.Class1InLibraryA' 类型在未引用的程序集中定义。您必须添加对程序集“Ploeh,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的引用。

您可以通过以下方式之一再次编译解决方案:

  • 从 LibraryC 中删除 CLS 合规性
  • 添加对 LibraryA 的引用(尽管您不需要它)
  • 更改 LibraryC 中的命名空间,使其不属于 LibraryB 的命名空间层次结构(例如更改为 Fnaah.Samples.LibraryC)
  • 更改 Class1InLibraryB 的命名空间(即 LibracyC 中使用的命名空间),使其不在 LibraryC 的命名空间层次结构中(例如更改为 Ploeh.Samples.LibraryB)

名称空间层次结构和 CLS 合规性之间似乎存在一些奇怪的相互作用。

可以通过选择上面列表中的一个选项来解决这个问题,但是任何人都可以解释这种行为背后的原因吗?

0 投票
17 回答
34792 浏览

.net - .NET 中 API 重大更改的权威指南

我想尽可能多地收集有关 .NET/CLR 中 API 版本控制的信息,特别是 API 更改如何破坏或不破坏客户端应用程序。首先,让我们定义一些术语:

API 更改- 公开可见的类型定义的更改,包括其任何公共成员。这包括更改类型和成员名称、更改类型的基类型、从类型的已实现接口列表中添加/删除接口、添加/删除成员(包括重载)、更改成员可见性、重命名方法和类型参数、添加默认值对于方法参数,添加/删除类型和成员的属性,以及添加/删除类型和成员的泛型类型参数(我错过了什么吗?)。这不包括成员机构的任何变化,或私人成员的任何变化(即我们不考虑反射)。

二进制级中断- API 更改导致针对旧版本 API 编译的客户端程序集可能不会与新版本一起加载。示例:更改方法签名,即使它允许以与以前相同的方式调用(即:void 返回类型/参数默认值重载)。

源代码级中断- 一种 A​​PI 更改,导致编写的现有代码针对旧版本的 API 进行编译可能无法与新版本一起编译。然而,已经编译的客户端程序集像以前一样工作。示例:添加一个新的重载可能会导致之前明确的方法调用出现歧义。

源代码级别的安静语义更改- 一种 A​​PI 更改,导致编写用于针对旧版本 API 进行编译的现有代码悄悄地更改其语义,例如通过调用不同的方法。然而,代码应该继续编译而没有警告/错误,并且以前编译的程序集应该像以前一样工作。示例:在现有类上实现一个新接口,导致在重载决议期间选择不同的重载。

最终目标是对尽可能多的中断和安静语义 API 更改进行分类,并描述中断的确切影响,以及哪些语言受其影响和不受其影响。扩展后者:虽然某些更改普遍影响所有语言(例如,向接口添加新成员将破坏该接口在任何语言中的实现),但有些更改需要非常特定的语言语义才能发挥作用才能获得突破。这通常涉及方法重载,并且通常涉及与隐式类型转换有关的任何事情。即使对于符合 CLS 的语言(即至少符合 CLI 规范中定义的“CLS 消费者”规则的语言),似乎也没有任何方法可以在这里定义“最小公分母”——尽管我 如果有人在这里纠正我的错误,我将不胜感激 - 所以这将不得不按语言进行。最感兴趣的自然是 .NET 开箱即用的那些:C#、VB 和 F#;但其他的,如 IronPython、IronRuby、Delphi Prism 等也是相关的。越是极端情况,它就越有趣——移除成员之类的事情是不言而喻的,但是方法重载、可选/默认参数、lambda 类型推断和转换运算符之间的微妙交互可能会非常令人惊讶有时。

几个例子来启动这个:

添加新的方法重载

种类:源级中断

受影响的语言:C#、VB、F#

变更前的 API:

变更后的API:

示例客户端代码在更改之前工作并在更改之后中断:

添加新的隐式转换运算符重载

种类:源级中断。

受影响的语言:C#、VB

不受影响的语言:F#

变更前的 API:

变更后的API:

示例客户端代码在更改之前工作并在更改之后中断:

注意:F# 没有损坏,因为它没有任何语言级别的对重载运算符的支持,无论是显式的还是隐式的 - 都必须直接调用op_Explicitop_Implicit方法。

添加新的实例方法

Kind:源级安静的语义变化。

受影响的语言:C#、VB

不受影响的语言:F#

变更前的 API:

变更后的API:

遭受安静语义更改的示例客户端代码:

注意:F# 没有损坏,因为它没有语言级别的支持ExtensionMethodAttribute,并且需要将 CLS 扩展方法作为静态方法调用。

0 投票
3 回答
5093 浏览

.net - “数组作为属性参数不符合 CLS”警告,但没有给出类型信息

在编译我的解决方案时,我收到以下几个警告:

没有给出关于什么类型不合规的其他信息。在我的项目中,我有一些属性在其构造函数中采用 params 数组参数,但它们都是内部的,不应影响 CLS 合规性。为什么会给出这个警告,它是在什么类型上给出的?

0 投票
2 回答
1728 浏览

.net - 标记项目中的所有类符合 CLS

如果我有一个项目并将其标记为

我需要在项目中的每个CLSCompliant(True)类之前放置,还是它们都默认为 CLSCompliant?