6

我在 ac# 类库中有以下代码...

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 吗?

4

1 回答 1

5

发生这种情况是因为您从标记为符合 CLS 的程序集中公开公开来自不符合 CLS 的程序集的类型。

请注意,您可以在符合 CLS 的程序集中使用不符合 CLS 的类型;但是你不能暴露这样的类型。

例如,假设您在不符合 CLS 的程序集中有此类:

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()'s使用MyEnum 非兼容程序集中的类型,因为它仅在内部使用。

但它会警告您不要将其公开为MyTest2().

如果通过添加[assembly: CLSCompliant(true)]to使非 CLS 兼容程序集兼容AssemblyInfo.cs,则代码将全部编译而不会发出警告。

重申一下:如果您使用在不兼容程序集中定义的类型,则该类型自动不兼容,即使它只是像枚举这样的基本类型。

来自CLSCompliantAttribute 的 Microsoft 文档

如果没有 CLSCompliantAttribute 应用于程序元素,则默认情况下:

  • 该程序集不符合 CLS。

  • 仅当其封闭类型或程序集符合 CLS 时,该类型才符合 CLS。

  • 仅当类型符合 CLS 时,类型的成员才符合 CLS。

于 2015-10-13T12:26:02.680 回答