Почему я получаю предупреждение о компиляторе
Идентификатор 'Logic.DomainObjectBase._isNew' не соответствует CLS
для следующего кода?
public abstract class DomainObjectBase
{
protected bool _isNew;
}
Почему я получаю предупреждение о компиляторе
Идентификатор 'Logic.DomainObjectBase._isNew' не соответствует CLS
для следующего кода?
public abstract class DomainObjectBase
{
protected bool _isNew;
}
Компиляторы языка, совместимые с CLS, должны следовать правилам Приложения 7 Технического отчета 15 Unicode Standard 3.0, который регулирует набор символов, которые могут запускаться и включаться в идентификаторы. Этот стандарт доступен на веб-сайте Консорциума Unicode.
Если вы просмотрите это:
То есть первым символом идентификатора может быть буква верхнего регистра, строчная буква, буква заголовка, письмо-модификатор, другая буква или номер письма. Последующие символы идентификатора могут быть любыми из них, плюс метки без пробелов, интервалы объединения меток, десятичные числа, пунктуации соединителей и коды форматирования (такие как правая левая метка). Обычно коды форматирования должны быть отфильтрованы перед сохранением или сравнением идентификаторов.
В принципе, вы не можете запустить идентификатор с подчеркиванием - это нарушает совместимость с CLS в видимом (общедоступном/защищенном) поле.
Соответствие 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;
Ведущий подчеркивание, при котором _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
начинается с подчеркивания.