我在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问题吗?
答案 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与其他组件兼容。”