枚举类型的使用不符合CLS标准。

7
我在一个C#类库中有以下代码...
public static class foo
{
    public enum bar
    {
        bsNone = -1,
        bsSolid = 0,
        bsDash = 1  
    }
}

在一个VB.Net Winforms应用程序中,我将枚举作为属性的返回类型进行引用:

Private _LeftBorderStyle As foo.bar
Public Property LeftBorderStyle() As foo.bar
    Get
        Return _LeftBorderStyle
    End Get
    Set(ByVal value As foo.bar)            
        _LeftBorderStyle = value
    End Set
End Property

当我构建VB.Net项目时,我收到以下警告:
Return type of function 'LeftBorderStyle' is not CLS-compliant.

你能告诉我为什么枚举类型不符合CLS标准吗?

可能是参数类型不符合CLS规范,为什么?的重复问题。 - Backs
不是的。但我不明白为什么类中其他 4,000 行代码没有给我 CLS 兼容性警告?只有枚举吗? - Richard Moore
@Backs - 谢谢,那篇文章没有解释为什么枚举是非CLS兼容的。 - Richard Moore
你能将你的C#程序集标记为CLS-Compliant([assembly:CLSCompliant(true)]),然后尝试构建C#项目吗?它是否提供了有关错误的额外信息? - Rob
@Rob,这样做可以消除枚举警告,但会创建其他不相关的关于在构造函数中传递数组的警告。我真的想了解CLS-Compliance问题,而不是抑制它。 - Richard Moore
显示剩余5条评论
1个回答

7
这是因为您从一个标记为CLS-Compliant的程序集中公开了一个来自非CLS-Compliant程序集的类型。请注意,您可以在CLS-Compliant程序集中使用非CLS-Compliant的类型;但是您不能公开此类类型。例如,假设您有一个非CLS-Compliant程序集中的此类:
namespace NonCLSCompliantAssembly
{
    public class Class1
    {
        public enum MyEnum
        {
            Red,
            Green,
            Blue
        }
    }
}

现在假设您有一个类,在一个符合CLS的程序集中,该程序集引用了不符合CLS的程序集:
namespace CLSCompliantAssembly
{
    public class Class1
    {
        // This does NOT give a warning.

        public int MyTest1()
        {
            return (int) NonCLSCompliantAssembly.Class1.MyEnum.Red;
        }

        // This DOES give a warning.

        public NonCLSCompliantAssembly.Class1.MyEnum MyTest2()
        {
            return NonCLSCompliantAssembly.Class1.MyEnum.Red;
        }
    }
}

编译器不会警告你关于MyTest1()使用非兼容程序集中的类型MyEnum,因为它仅在内部使用。
但是,如果将其作为公共返回类型暴露给MyTest2(),则会发出警告。
如果通过在AssemblyInfo.cs中添加[assembly: CLSCompliant(true)]使非CLS兼容程序集兼容,则所有代码都将编译而无需警告。
重申一下:如果使用在非兼容程序集中定义的类型,即使只是基本类型如枚举,该类型也自动为非兼容。
来自Microsoft CLSCompliantAttribute文档
如果程序元素没有应用CLSCOmpliantAttribute,则默认情况下: - 程序集不符合CLS标准。 - 当其封装的类型或程序集符合CLS标准时,类型才符合CLS标准。 - 类型的成员仅在类型符合CLS标准时才符合CLS标准。

4
为什么枚举不符合标准呢? - Rob
1
@Rob 这是不兼容的,因为它是在一个不兼容的程序集中定义的。我在回复的第一句话中就已经说过了... ;) - Matthew Watson
谢谢@Matthew,问题是为什么编译器只在不符合规范的程序集中抱怨枚举,而不是其中成千上万的其他类?这是编译器只是抓住最近的可以抱怨的东西吗? - Richard Moore
@RichardMoore 像我在答案中所说的那样,您可以使用其他类,但是不允许从公共方法返回它们或将它们作为参数传递给您程序集中的公共方法。请查看我的示例,其中写着“这不会产生警告”。 - Matthew Watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接