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