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

Это зависит. В отладочная сборка, я хочу видеть исходное отслеживание стека с как можно меньшим усилием. В этом случае, "бросок"; отвечает всем требованиям. В сборке конечных версий, однако, (a) я хочу зарегистрировать ошибку с исходным отслеживанием стека, включенным, и как только это сделано, (b) повторно сформируйте обработку ошибок, чтобы иметь больше смысла пользователю. Здесь "Выдают Исключение", имеет смысл. Это верно, что перебросок ошибки отбрасывает исходное отслеживание стека, но неразработчик ничего не вытаскивает из наблюдения информации трассировки стека, таким образом, это должно хорошо повторно бросить ошибку.

        void TrySuspectMethod()
        {
            try
            {
                SuspectMethod();
            }
#if DEBUG
            catch
            {
                //Don't log error, let developer see 
                //original stack trace easily
                throw;
#else
            catch (Exception ex)
            {
                //Log error for developers and then 
                //throw a error with a user-oriented message
                throw new Exception(String.Format
                    ("Dear user, sorry but: {0}", ex.Message));
#endif
            }
        }

путь вопрос сформулирован, сложив "Бросок": по сравнению с "Броском исключая"; делает его определенным отвлекающим маневром. Реальный выбор между "Броском"; и "Выдают Исключение", где "Бросок исключая"; маловероятный особый случай, "Выдают Исключение".

54
задан MatthewMartin 10 September 2014 в 03:16
поделиться

8 ответов

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

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

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

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

80
ответ дан 7 November 2019 в 07:40
поделиться

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

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

[assembly: CLSCompliant(true)]

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

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

  • Сделайте сборку несовместимой с CLS:

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

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

     private bool _isNew;
    
  • 40
    ответ дан 7 November 2019 в 07:40
    поделиться

    Используйте $ RANDOM . Это часто полезно в сочетании с простой арифметикой оболочки. Например, чтобы сгенерировать случайное число от 1 до 10:

    $ echo $((1 + RANDOM % 10))
    3
    

    Фактический генератор находится в variables.c , функция brand () . Старые версии представляли собой простой линейный генератор. Версия 4.0 bash использует генератор со ссылкой на статью 1985 года, что, по-видимому, означает, что это достойный источник псевдослучайных чисел. Я бы не стал использовать его для моделирования (и уж точно не для криптографии), но он, вероятно, подходит для базовых задач написания сценариев.

    Если вы '

    28
    ответ дан 7 November 2019 в 07:40
    поделиться

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

    Например:

    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; }
    }
    
    7
    ответ дан 7 November 2019 в 07:40
    поделиться

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

    2
    ответ дан 7 November 2019 в 07:40
    поделиться

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

    1
    ответ дан 7 November 2019 в 07:40
    поделиться

    Ведущий _ не соответствует требованиям CLS

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

    1
    ответ дан 7 November 2019 в 07:40
    поделиться

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

    0
    ответ дан 7 November 2019 в 07:40
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: