gpt4 book ai didi

c# - "Type is not cls-compliant"在某些地方警告但在其他地方没有

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:44 25 4
gpt4 key购买 nike

我在 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) 下的属性和构造函数上,但不会出现在私有(private)类成员中。

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

最佳答案

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

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

   [assembly:CLSCompliant(true)]

请记住,CLS 合规性是一个过时的概念,它在 .NET 2.0 发布时不再相关。不仅仅是因为它使 VB.NET 陷入困境并弃用了 JScript,将泛型视为不兼容的想法也是一种延伸。改造现有语言以支持泛型是一项相当大的工作。值得注意的是,您的类(class)需要消费者知道如何处理 List(Of T),它不会与 NetCOBOL 或 Fortran for .NET 一起使用。因此,简化您的生活,只需从您的 VB.NET 代码中删除该属性即可。

关于c# - "Type is not cls-compliant"在某些地方警告但在其他地方没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com