【问题标题】:"Type is not cls-compliant" warning in some places but not in others“类型不符合 cls”警告在某些地方但在其他地方没有
【发布时间】:2014-09-05 03:35:28
【问题描述】:

我在 C# 中有非常简单的模型类,具有 5 个自动属性 ​​- 4 个 int 和一个 string

public class MyModel
{

    public int id { get; set; }
    public int refId { get; set; }
    public int type { get; set; }
    public int mappingId { get; set; }
    public string name { get; set; }

}

我在 vb.net 中有一个类,可以调用并检索此模型的列表

Dim models As List(Of MyModel) = DataProvider.GetModels(refId)

这很好,一直在工作,没有警告。

但现在我正在重构和构建一个抽象基类,它在构造函数中接收这个模型列表

Public MustInherit Class MySpecialBase
    Private ReadOnly _models As List(Of MyModel) ' No Warning

    Public Sub New (ByVal models As List(Of MyModel)) 'Warning
        _models = models
    End Sub

    Protected ReadOnly Property Models As List(Of MyModel) ' Warning
        Get
            Return _models
        End Get
    End Property
End Class

即使在这个抽象类中,警告也会出现在 (Of MyModel) 下的属性和构造函数上,但不会出现在私有类成员中。

我看不出这个模型是如何不符合 cls 的。两个程序集(vb 和 c#)都是类库。有人可以解释这种行为吗?是VS的问题吗?

【问题讨论】:

  • 我使用您的代码并在 .Net Framework 3.5 中创建了两个库项目。但我没有收到任何错误。每件事都是完美的。我还尝试了使用不同的 .Net 框架的相同代码,但仍然没有收到任何错误。让我知道您使用的是哪个版本的 VS。
  • @NitinJoshi vs 2012。看看我对“Ripple”答案的评论

标签: c# vb.net .net-3.5


【解决方案1】:

这很容易解释,只有 Public 的声明会被检查是否符合 CLS。你的私人成员不能违反规则,其他代码也不能使用它,所以也不会惹上麻烦。

您收到警告是因为 C# 程序集未标记为兼容。你必须在任何你喜欢的地方添加这个属性:

   [assembly:CLSCompliant(true)]

请记住,CLS 合规性是一个过时的概念,当 .NET 2.0 发布时它不再相关。不仅仅是因为它使 VB.NET 被扼杀并弃用了 JScript,not 认为泛型不兼容的概念是一种延伸。改造现有语言以支持泛型是一项相当大的工作。值得注意的是,您的课程要求使用者知道如何处理 List(Of T),它不适用于 NetCOBOL 或 Fortran for .NET。因此,简化您的生活,只需从您的 VB.NET 代码中删除该属性即可。

【讨论】:

  • 这就是你提出这么多观点的原因。我把它放在我的眼前,并没有因为私人的东西是好的而公共的不是……谢谢你。无论如何,我正要从程序集中删除该属性。
【解决方案2】:

也许您的 C# 类没有标记为 CLSCompliant,而 VB 是。

在 VB 项目中检查您的 AssemblyInfo.vb。 如果它包含<Assembly: CLSCompliant(True)>,如果您不需要它,请将其删除。 (听说旧版VS会自动添加,但无法验证。)

编辑:
确定一个类是否符合 CLS 取决于它的公共/受保护接口(签名),因此在方法内部或作为私有/内部成员使用不符合要求的类并不重要。
“CLS 兼容”是指“与其他程序集的外观兼容”。

【讨论】:

  • 没错,vb 项目从 2003 年就一直存在,并且在程序集信息中有 CLSCompliant。诚然,C# 类未标记为 CLSCompliant - 并且不需要 - 其中的所有类型都符合要求。直到我用它作为论据它才抱怨。在行代码中它不会抱怨它 - 仅在声明中。
  • 添加了对此的解释。
猜你喜欢
  • 1970-01-01
  • 2017-04-05
  • 2011-03-21
  • 2020-02-23
  • 2016-07-03
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
相关资源
最近更新 更多