Подтвердить что ты не робот

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

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

Идентификатор 'Logic.DomainObjectBase._isNew' не соответствует CLS

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

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
4b9b3361

Ответ 1

Из Общая спецификация языка:

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

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

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

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

Ответ 2

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

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

[assembly: CLSCompliant(true)]

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

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

  • Переименуйте свое свойство (рекомендуется):

    protected bool isNew;
    
  • Задайте всю сборку не совместимой с CLS:

    [assembly: CLSCompliant(false)]
    
  • Добавьте атрибут только к свойству:

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

    private bool _isNew;
    

Ответ 3

Ведущий подчеркивание, при котором _isNew отображается (т.е. не является частным).

Ответ 4

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

Например:

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; }
}

Ответ 5

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

Ответ 6

Это подчеркивание. См. Статью .

Ответ 7

Ведущий _ является не-CLS-совместимым

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

Ответ 8

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