问题标签 [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 投票
1 回答
178 浏览

.net - 如何使公共 MySQLDataReader 符合 CLS?

我有一个符合 CLS 的项目,除了一个变量声明让我感到困惑如何更正。

我有一个名为 MySQL 的类,总结起来是这样的:

用法:

作为 MySQLDataReader 的公共阅读器不符合 CLS,我不确定如何解决该问题。我已经升级到最新的 mysql 数据连接器版本。我想知道是否应该将其设为私有变量并读取结果抛出一个函数?

对于以下代码片段中的大写错误、拼写错误等,我深表歉意,我是在从远程桌面连接查看时输入的。

0 投票
0 回答
36 浏览

c# - Mandelbug:编译器需要的不需要的传递程序集引用;CLS 合规性;能见度

概述

调试一个有趣的错误,我剥离了一个解决方案,试图隔离它。该问题表现为典型的构建错误(未引用程序集)。

有趣的是,所讨论的程序集中没有任何类型用于无法构建的程序集中。移动using语句和删除 CLS 合规性属性会使错误消失,这意味着模糊符号可见性规则(可能)有效。

代码

除了项目 ( csproj) 文件外,此处逐行显示了整个代码库。

Foo/Alpha.cs

酒吧/Beta.cs

Baz/Gamma.cs

Baz/Properties/AssemblyInfo.cs

依赖项

在此处输入图像描述

所有项目参考SystemSystem.Core.
Baz参考资料Foo
Foo参考资料Bar

Foo.Alpha需要依赖继承Bar.Beta.
Baz.Gamma在实际解决方案中需要对其他类型的依赖Foo(与 无关Alpha)。在这个精简的解决方案中没有使用任何内容,但问题仍然存在。

编译错误

描述:The type 'Bar.Beta' is defined in an assembly that is not referenced. You must add a reference to assembly 'Bar, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
文件:src\Baz\Gamma.cs
行:1
列:11
项目:Baz

行为

在以下情况下问题消失:

  1. using语句放在命名空间块Gamma之外。Foo
  2. 删除程序集的CLSCompliant属性Baz
  3. Alpha不继承自Beta(即使Foo仍然引用Bar并且Alpha仍然Beta以其他方式使用,例如通过组合它)。
  4. Foo是遥不可及的Gamma(例如,通过将Gamma' 的命名空间更改为Baz)。
  5. Bar中添加了对 的引用Baz

其他项目是否符合 CLS 并不重要。在真正的解决方案中它们是。
目标框架似乎不会影响该行为。
我们在命名空间块中导入什么命名空间并不重要Gamma.cs,我们在using System;这里写,但它可以是任何东西。using如上所述,删除所有语句(或将它们放在命名空间块之外)会使问题消失。

问题

  1. 什么 CLS 规则会影响该行为?
  2. 为什么将using语句放在命名空间块内部或外部会影响该行为?
  3. 这不仅仅是一个好奇心,我们实际上有一个具有这种传递依赖的项目——我们是否应该添加对的引用,Bar即使它没有意义?(我们没有使用Alpha继承的类型。)

笔记

我知道编译器永远不会出错,但是当您不知道发生了什么(尤其是using语句放置的事情)时,它仍然看起来像一些严重的巫术。我浏览了 ECMA-335 (CLI) 的 I.11 部分,其中包含 CLS 规则的参考,但我无法确定哪一个是我应该理解的,但显然不是。

如果问题不明显,您应该能够通过简单地在空的 C# 项目中逐字复制代码并添加相同的引用来一致地重现它。

0 投票
2 回答
485 浏览

c# - EnumBuilder 是否总是创建不符合 CLS 的枚举?如何使枚举 CLS 兼容?

下面的代码示例生成 TempAssembly.dll,其中包含枚举 Elevation。

我引用了 TempAssembly.dll 并在另一个项目(比如项目 TestA)中使用了枚举 Elevation。由于我希望代码符合 CLS,因此我将以下属性添加到项目 TestA 中。

[程序集:System.CLSCompliant(true)]

我收到警告的代码是:

警告

警告 1 类型的“TestA.TestClass.Elev”不符合 CLS

我检查了有关如何编写符合 CLS 的代码的文档,但由于枚举是动态创建的,因此我无法做很多事情。任何建议,我怎样才能使枚举 CLS 兼容?

0 投票
3 回答
710 浏览

c# - 为什么 Stream.Write 不采用 UInt?

对我来说Stream.Write使用int,而不是...对我来说似乎非常不合逻辑UInt。对于这个事实,除了“遗留”代码之外还有其他解释吗?有人想写-1字节吗?!?

0 投票
0 回答
493 浏览

c# - 构造函数与 TimeSpan 参数不符合 CLS 并继承 Attribute

好的,我很困惑:当一个类的唯一构造函数有一个System.TimeSpan参数并且类继承自时,为什么类不符合 CLS System.Attribute

System.Attribute这是一个 min-repro,以及两者System.TimeSpan 符合 CLS 的证明:

编译运行:

(repros with any /langversion:1..5)

0 投票
0 回答
322 浏览

.net - 为什么 byte 符合 CLS 而 sbyte 不符合?

为什么无符号字节符合 CLS 而不是有符号字节?所有其他无符号类型都不符合 CLS,但它在字节上正好相反。

0 投票
0 回答
171 浏览

c# - 在程序集中更改 .net 类的字段名称

是否可以更改 .net 程序集中的字段名称?我在某些不区分大小写的脚本环境中使用该程序集,该环境抱怨此公共字段不符合 CLS。同一个类中存在同名的属性,只是字段和属性的首字母大小写不同。不幸的是,我没有消息来源。理想情况下,我会将其标记为私有或在字段名称中添加 _。我想知道是否有允许重命名类元数据之类的工具。我考虑过使用 redgate 反射器来提取代码并修改并编译回程序集。但这对我不起作用。

0 投票
1 回答
103 浏览

c# - 仅在从单元测试运行映射时,在构造函数中分配 IMappingEngine 会导致映射异常

我有一个单元测试 - 我在设置中执行 AutoMapperConfiguration。然后,我在我实际进行映射的类的构造函数中将 IMappingEngine 设置为私有属性。如果我使用此属性,单元测试将失败,但使用 automapper 中的静态方法可以正常工作。运行实际程序时,这两种方法都可以正常工作。我能看到的唯一区别是单元测试在单独的程序集中。CLS 合规性已打开。

0 投票
1 回答
2412 浏览

c# - 枚举的使用不符合 CLS

我在 ac# 类库中有以下代码...

在 VB.Net Winforms 应用程序中,我将枚举引用为属性的返回类型:

当我构建 VB.Net 项目时,我收到以下警告:

你能告诉我为什么枚举不符合 CLS 吗?

0 投票
1 回答
284 浏览

c# - 在构建时收到“参数类型‘StreamSocket’不符合 CLS”警告

我正在开发一个 UWP 库,它具有 StreamSocket 类的公共属性和方法参数。但是,我收到“StreamSocket 不符合 CLS”警告。有什么特别之处,以至于微软决定让相应的程序集不符合 CLS,在使用/分发这个库时我应该知道什么潜在的问题吗?也许 CLS 不合规会以某种方式限制其他开发人员使用我的库的方式?