Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is my code not CLS-compliant?

I've got errors when I build my project:

Warning as Error: Type of 'OthersAddresses.AddresseTypeParameter' is not CLS-compliant C:...\Units\OthersAddresses.ascx.cs

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

and this one:

Warning as Error: Type of 'Global.UserInSession' is not CLS-compliant 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;
    }
}

I added attribute [CLSCompliant(false)] before UserInSession and AddresseTypeParameter and it works but I would like to understand why it was not CLS-compliant.

Some more information about classes and enum:

Class User (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
        }

And

enum 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
    }
like image 357
Evilduky Avatar asked Jan 04 '12 14:01

Evilduky


2 Answers

You need to use the CLSCompliantAttribute:

If no CLSCompliantAttribute is applied to a program element, then by default:

  • The assembly is not CLS-compliant.
  • The type is CLS-compliant only if its enclosing type or assembly is CLS-compliant.
  • The member of a type is CLS-compliant only if the type is CLS-compliant.

Apart from this you need to ensure your assembly is indeed CLS compliant.

like image 152
Oded Avatar answered Oct 18 '22 18:10

Oded


This is letting you know that "Type of 'OthersAdresses.AdresseTypeParameter' is not CLS-compliant", not that the properties necessarily are. Take a look at the types, not the properties, and you will probably find what is causing the warning.

like image 24
Mark Avenius Avatar answered Oct 18 '22 19:10

Mark Avenius