【问题标题】:Why is my code not CLS-compliant?为什么我的代码不符合 CLS?
【发布时间】:2012-01-04 14:28:53
【问题描述】:

我在构建项目时遇到错误:

警告为错误:“OthersAddresses.AddresseTypeParameter”的类型不符合 CLS C:...\Units\OthersAddresses.ascx.cs

public Address.AddressTypeEnum AddressTypeParameter
    {
        get 
        {
            return _addressTypeParameter;
        }
        set 
        {
            _addressTypeParameter = value;
        }
    }

还有这个:

警告为错误:“Global.UserInSession”类型不符合 CLS C:...\Global.asax.cs

public static User UserInSession
{
    get
    {
        return (HttpContext.Current.Session["CurrentUser"] == null) 
            ? null 
            : HttpContext.Current.Session["CurrentUser"] as User;
    }
    set
    {
        HttpContext.Current.Session["CurrentUser"] = value;
    }
}

我在 UserInSessionAddresseTypeParameter 之前添加了属性 [CLSCompliant(false)] 并且它有效,但我想了解它为什么不符合 CLS。

更多关于类和枚举的信息:

类用户 (User.cs)

public class User
    {
        private string _uniqueIdentifier;
        private string _password = string.Empty;
        private string _email = string.Empty;
        private string _passwordQuestion = string.Empty;
        private string _passwordAnswer = string.Empty;
        private string _id_directions_db = string.Empty;
        private string _id_gesab = string.Empty;
        private string _zipCode = string.Empty;
        private string _fonction_id = string.Empty;
        private string _fonction = string.Empty;
        private string _structure_id = string.Empty;
        private string _structure = string.Empty;
        private string _firstName = string.Empty;
        private string _lastName = string.Empty;
        private string _company = string.Empty;
        private string _avatarPath = string.Empty;
        private Role _role = new Role();
        private List<Address> _addressList = new List<Address>();
        private string _otherInformation = string.Empty;
        private MembershipUser _membershipUserAssociated = null;
        ...

        public enum GenderEnum
        {
            Empty = 0,
            Monsieur,
            Madame
        }

枚举 AddressTypeEnum (Address.cs)

public class Address
{
    private AddressTypeEnum _addressType;
    private string _firstName = string.Empty;
    private string _lastName =string.Empty;
    private string _structure = string.Empty;
    private string _structureComplementary = string.Empty;
    private string _addressStreet = string.Empty;
    private string _addressComplementary = string.Empty;
    private string _bp = string.Empty;
    private string _zipCode = string.Empty;
    private string _country = string.Empty;
    private string _countryId = string.Empty;
    private string _city = string.Empty;
    private string _phone = string.Empty;
    private string _fax = string.Empty;
    private string _email = string.Empty;

    public enum AddressTypeEnum
    {
        Empty = 0,
        Personal = 1,
        Billing = 2,
        Delivery = 3
    }

【问题讨论】:

  • 可能您必须显示UserAddress 类的定义以进一步帮助您。
  • 顺便说一句,地址拼错了。
  • 您是否使属性类型符合 CLS?
  • 您是否真的想知道为什么您的代码不符合 CLS,或者您只是想知道如何摆脱这些警告错误?换句话说,您确定您的代码必须、必须、绝对必须符合 CLS 标准吗?
  • 阅读编写符合 CLS 的代码的指南;其中大部分解释了您遇到的错误:msdn.microsoft.com/en-us/library/bhc3fa7f.aspx

标签: c# .net cls-compliant


【解决方案1】:

您需要使用CLSCompliantAttribute:

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

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

除此之外,您还需要确保您的程序集确实是CLS compliant

【讨论】:

  • 跟进,您将收到这些类型的警告——“X”不符合 CLS——如果您使用的程序集中的类型未标记为 CLSCompliant,则.将指示的属性添加到“源”项目的 AssemblyInfo.cs 文件通常会解决此问题。
【解决方案2】:

这是让您知道“'OthersAdresses.AdresseTypeParameter' 的类型不符合 CLS”,而不是属性必须符合。查看类型,而不是属性,您可能会发现导致警告的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多