问题标签 [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.
.net - 如何使公共 MySQLDataReader 符合 CLS?
我有一个符合 CLS 的项目,除了一个变量声明让我感到困惑如何更正。
我有一个名为 MySQL 的类,总结起来是这样的:
用法:
作为 MySQLDataReader 的公共阅读器不符合 CLS,我不确定如何解决该问题。我已经升级到最新的 mysql 数据连接器版本。我想知道是否应该将其设为私有变量并读取结果抛出一个函数?
对于以下代码片段中的大写错误、拼写错误等,我深表歉意,我是在从远程桌面连接查看时输入的。
c# - Mandelbug:编译器需要的不需要的传递程序集引用;CLS 合规性;能见度
概述
调试一个有趣的错误,我剥离了一个解决方案,试图隔离它。该问题表现为典型的构建错误(未引用程序集)。
有趣的是,所讨论的程序集中没有任何类型用于无法构建的程序集中。移动using
语句和删除 CLS 合规性属性会使错误消失,这意味着模糊符号可见性规则(可能)有效。
代码
除了项目 ( csproj
) 文件外,此处逐行显示了整个代码库。
Foo/Alpha.cs
酒吧/Beta.cs
Baz/Gamma.cs
Baz/Properties/AssemblyInfo.cs
依赖项
所有项目参考System
和System.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
行为
在以下情况下问题消失:
- 将
using
语句放在命名空间块Gamma
之外。Foo
- 删除程序集的
CLSCompliant
属性Baz
。 Alpha
不继承自Beta
(即使Foo
仍然引用Bar
并且Alpha
仍然Beta
以其他方式使用,例如通过组合它)。Foo
是遥不可及的Gamma
(例如,通过将Gamma
' 的命名空间更改为Baz
)。Bar
中添加了对 的引用Baz
。
其他项目是否符合 CLS 并不重要。在真正的解决方案中它们是。
目标框架似乎不会影响该行为。
我们在命名空间块中导入什么命名空间并不重要Gamma.cs
,我们在using System;
这里写,但它可以是任何东西。using
如上所述,删除所有语句(或将它们放在命名空间块之外)会使问题消失。
问题
- 什么 CLS 规则会影响该行为?
- 为什么将
using
语句放在命名空间块内部或外部会影响该行为? - 这不仅仅是一个好奇心,我们实际上有一个具有这种传递依赖的项目——我们是否应该添加对的引用,
Bar
即使它没有意义?(我们没有使用Alpha
继承的类型。)
笔记
我知道编译器永远不会出错,但是当您不知道发生了什么(尤其是using
语句放置的事情)时,它仍然看起来像一些严重的巫术。我浏览了 ECMA-335 (CLI) 的 I.11 部分,其中包含 CLS 规则的参考,但我无法确定哪一个是我应该理解的,但显然不是。
如果问题不明显,您应该能够通过简单地在空的 C# 项目中逐字复制代码并添加相同的引用来一致地重现它。
c# - EnumBuilder 是否总是创建不符合 CLS 的枚举?如何使枚举 CLS 兼容?
下面的代码示例生成 TempAssembly.dll,其中包含枚举 Elevation。
我引用了 TempAssembly.dll 并在另一个项目(比如项目 TestA)中使用了枚举 Elevation。由于我希望代码符合 CLS,因此我将以下属性添加到项目 TestA 中。
[程序集:System.CLSCompliant(true)]
我收到警告的代码是:
警告
警告 1 类型的“TestA.TestClass.Elev”不符合 CLS
我检查了有关如何编写符合 CLS 的代码的文档,但由于枚举是动态创建的,因此我无法做很多事情。任何建议,我怎样才能使枚举 CLS 兼容?
c# - 为什么 Stream.Write 不采用 UInt?
对我来说Stream.Write使用int
,而不是...对我来说似乎非常不合逻辑UInt
。对于这个事实,除了“遗留”代码之外还有其他解释吗?有人想写-1
字节吗?!?
c# - 构造函数与 TimeSpan 参数不符合 CLS 并继承 Attribute
好的,我很困惑:当一个类的唯一构造函数有一个System.TimeSpan
参数并且类继承自时,为什么类不符合 CLS System.Attribute
?
System.Attribute
这是一个 min-repro,以及两者System.TimeSpan
都符合 CLS 的证明:
编译运行:
(repros with any /langversion:1..5
)
.net - 为什么 byte 符合 CLS 而 sbyte 不符合?
为什么无符号字节符合 CLS 而不是有符号字节?所有其他无符号类型都不符合 CLS,但它在字节上正好相反。
c# - 在程序集中更改 .net 类的字段名称
是否可以更改 .net 程序集中的字段名称?我在某些不区分大小写的脚本环境中使用该程序集,该环境抱怨此公共字段不符合 CLS。同一个类中存在同名的属性,只是字段和属性的首字母大小写不同。不幸的是,我没有消息来源。理想情况下,我会将其标记为私有或在字段名称中添加 _。我想知道是否有允许重命名类元数据之类的工具。我考虑过使用 redgate 反射器来提取代码并修改并编译回程序集。但这对我不起作用。
c# - 仅在从单元测试运行映射时,在构造函数中分配 IMappingEngine 会导致映射异常
我有一个单元测试 - 我在设置中执行 AutoMapperConfiguration。然后,我在我实际进行映射的类的构造函数中将 IMappingEngine 设置为私有属性。如果我使用此属性,单元测试将失败,但使用 automapper 中的静态方法可以正常工作。运行实际程序时,这两种方法都可以正常工作。我能看到的唯一区别是单元测试在单独的程序集中。CLS 合规性已打开。
c# - 枚举的使用不符合 CLS
我在 ac# 类库中有以下代码...
在 VB.Net Winforms 应用程序中,我将枚举引用为属性的返回类型:
当我构建 VB.Net 项目时,我收到以下警告:
你能告诉我为什么枚举不符合 CLS 吗?
c# - 在构建时收到“参数类型‘StreamSocket’不符合 CLS”警告
我正在开发一个 UWP 库,它具有 StreamSocket 类的公共属性和方法参数。但是,我收到“StreamSocket 不符合 CLS”警告。有什么特别之处,以至于微软决定让相应的程序集不符合 CLS,在使用/分发这个库时我应该知道什么潜在的问题吗?也许 CLS 不合规会以某种方式限制其他开发人员使用我的库的方式?