“类型不符合类别”;有些地方有警告,有些地方没有

本文关键字:警告 方没 不符合 类型 | 更新日期: 2023-09-27 18:12:50

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

“类型不符合类别”;有些地方有警告,有些地方没有

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

你得到警告是因为c#程序集没有被标记为兼容。你必须在任何你喜欢的地方添加这个属性:

   [assembly:CLSCompliant(true)]

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

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

检查VB项目中的AssemblyInfo.vb。如果它含有<Assembly: CLSCompliant(True)>,如果你不需要它,就把它去掉。(我听说旧版本的VS会自动添加,但我无法验证)

编辑:


确定一个类是否符合cls取决于它的公共/受保护的接口(签名),因此在方法中使用不符合cls的类或作为私有/内部成员并不重要。
"cls兼容"是指"看起来与其他程序集兼容"。