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

StackOverflow https://stackoverflow.com/questions/1195030

  •  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, который в большинстве проектов можно найти в разделе «Свойства».

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

  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.

Майкрософт СтильКоп проанализирует ваш код и предоставит ссылки на соответствующие документы, объясняющие, почему он не совместим с CLS.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top