"类型不符合cls"在某些地方发出警告,但在其他地方没有

时间:2014-07-15 04:12:25

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

我在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问题吗?

2 个答案:

答案 0 :(得分:3)

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

您收到警告,因为C#程序集未标记为合规。您必须在任何地方添加此属性:

   [assembly:CLSCompliant(true)]

请记住,CLS合规性是一个过时的概念,它在.NET 2.0发布时不再适用。不只是因为它使VB.NET达到了鼻烟并且弃用了JScript,的概念认为泛型不合规是一个延伸。改造现有语言以支持泛型是一项相当重要的工作。值得注意的是,您的类需要消费者知道如何处理List(Of T),它不能与NetCOBOL或Fortran for .NET一起使用。因此,简化您的生活,只需从VB.NET代码中删除该属性。

答案 1 :(得分:-1)

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

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

修改
确定一个类是否符合CLS取决于它的公共/受保护接口(签名),因此在方法内部使用不合适的类或作为私有/内部成员并不重要。
“符合CLS”意味着“LOOKS与其他组件兼容。”