Почему это имя с подчеркиванием не соответствует CLS?



почему я получаю предупреждение компилятора




Идентификатор 'Логика.DomainObjectBase._isNew' не является CLS-совместимым




для следующего кода?



public abstract class DomainObjectBase
{
protected bool _isNew;
}
473   8  

8 ответов:

с Спецификация Общего Языка:

CLS-совместимые языковые компиляторы должны следовать правилам приложения 7 к техническому отчету 15 стандарта Unicode 3.0, который регулирует набор символов, которые могут начинаться и включаться в идентификаторы. Этот стандарт доступен на веб-сайте консорциума Unicode.

Если вы посмотреть:

то есть, первый символ идентификатор может быть прописной буквой, строчной буквой, заглавной буквой, буквой модификатора, другой буквой или номером буквы. Последующие символы идентификатора могут быть любыми из них, а также знаками без интервалов, знаками объединения интервалов, десятичными числами, знаками препинания соединителя и кодами форматирования (например, знак справа налево). Обычно коды форматирования должны быть отфильтрованы перед сохранением или сравнением идентификаторов.

в принципе, вы не можете запустить идентификатор с помощью подчеркивание-это нарушает CLS-совместимый на видимом (общедоступном/защищенном) поле.

CLS compliance имеет отношение к взаимодействию между различными языками .NET. Свойство не соответствует CLS, так как оно начинается с символа подчеркивания и является общедоступным (примечание: к защищенным свойствам в общедоступном классе можно получить доступ извне сборки). Хотя это будет работать, если доступ к свойству осуществляется из C#, это может быть не так, если он доступен из других языков .NET, которые не позволяют подчеркивания в начале имен свойств, следовательно, это не так CLS-совместимый.

вы получаете эту ошибку компилятора, потому что где-то в вашем коде вы обозначили свою сборку как CLS совместимую со строкой что-то вроде этого:

[assembly: CLSCompliant(true)]

Visual Studio включает эту строку в AssemblyInfo.CS файл, который можно найти в разделе свойства в большинстве проектов.

чтобы обойти эту ошибку, вы можете либо:

  1. переименовать вашу собственность (рекомендуется):

    protected bool isNew;
    
  2. установите всю сборку в соответствии с CLS:

    [assembly: CLSCompliant(false)]
    
  3. добавить атрибут только для вашего имущества:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
  4. измените область действия свойства, чтобы его нельзя было увидеть за пределами сборки.

    private bool _isNew;
    

ведущий подчеркивание одновременно с _isNew быть видимым (т. е. не частным).

подчеркивание вызывает проблему. Обычная практика заключается в том, что подчеркивание зарезервировано для частного поля. защищенные / открытые члены должны быть надлежащим образом защищены и названы.

например:

public abstract class DomainObjectBase{   
   private bool _isNew;
   protected bool IsNew { get { return _isNew; } set { _isNew = value;} }
}

или, если вы хотите использовать 3.X и избавиться от частного поля:

public abstract class DomainObjectBase{   
   protected bool IsNew { get; set; }
}

CLS-совместимый идентификатор не должен начинаться с подчеркивания.

Это подчеркнуть. Смотрите это статьи.

ведущий _ не соответствует CLS

Microsoft StyleCop проанализирует ваш код и предоставит ссылки на соответствующие документы, объясняющие, почему он не соответствует CLS.

потому что имя элемента данных _isNew, начните с подчеркивания.

Comments

    Ничего не найдено.