“类型不符合类别”;有些地方有警告,有些地方没有
本文关键字:警告 方没 不符合 类型 | 更新日期: 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兼容"是指"看起来与其他程序集兼容"。