Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматриваются следующие ошибки и предупреждения компилятора:
- CS8116: Недопустимо использовать тип, допускающий значение NULL, в шаблоне; вместо этого используйте базовый тип.
- CS8117: Недопустимый операнд для сопоставления шаблонов; необходимо значение, но было найдено выражение.
- CS8119: выражение коммутатора должно быть значением; найдено выражение.
- CS8120: случай переключения недоступен. Это уже было обработано предыдущим случаем или невозможно сопоставить.
- CS8121: выражение типа источника не может обрабатываться шаблоном целевого типа.
- CS8208: не является законным использовать тип dynamic в шаблоне.
- CS8502: Сопоставление типа кортежа требует определённых подпаттернов, однако некоторые подпаттерны являются некорректными.
- CS8503: Для подпаттерна свойства требуется ссылка для сопоставления с свойством или полем, например "{{ Имя: значение }}".
- CS8504: отсутствие шаблона
- CS8505: литерал по умолчанию "по умолчанию" недопустим как шаблон. Используйте другой литерал (например, 0 или null). Чтобы сопоставить все, используйте шаблон отмены '_'.
- CS8506: для выражения коммутатора не найден лучший тип.
-
CS8508: синтаксис var для шаблона не допускает ссылки на тип, но тип
varнаходится в области видимости. - CS8509: выражение коммутатора не обрабатывает все возможные значения входного типа (это не является исчерпывающим). Например, шаблон "..." не охватывается.
- CS8510: шаблон недоступен. Он уже был обработан предыдущей рукой выражения коммутатора или невозможно сопоставить.
- CS8512: имя "_" относится к константе, а не шаблону отбрасывания. Используйте "var _" для отбрасывания значения или "@_", чтобы сделать ссылку на константу по этому имени.
-
CS8513: имя "_" ссылается на тип
_, а не паттерн отбрасывания. Используйте "@_" для типа или "var _" для отбрасывания. - CS8515: круглые скобки требуются вокруг переключателя, регулирующего выражение.
- CS8516: имя не определяет элемент кортежа '{1}'.
- CS8517: имя не соответствует соответствующему параметру deconstruct.
- CS8518: выражение этого типа никогда не может соответствовать предоставленному шаблону.
- CS8519: данное выражение никогда не соответствует предоставленному шаблону.
- CS8520: заданное выражение всегда соответствует предоставленной константе.
- CS8521: сопоставление шаблонов не допускается для типов указателей.
- CS8522: имена элементов не допускаются при сопоставлении шаблонов с помощью system.Runtime.CompilerServices.ITuple.
- CS8523: Шаблон игнорирования не разрешен в операторе switch как метка случая. Используйте "case var _:" для шаблона игнорирования или "case @_:" для константы с именем "_".
- CS8524: выражение коммутатора не обрабатывает некоторые значения входного типа (это не является исчерпывающим) с использованием неназванного значения перечисления.
- CS8525: Указатель переменной должен следовать после шаблона свойства.
- CS8780: переменная не может быть объявлена в шаблоне "не" или "или".
- CS8781: реляционные шаблоны не могут использоваться для значения этого типа.
- CS8782: Реляционные шаблоны не могут использоваться для NaN с плавающей запятой.
- CS8793: заданное выражение всегда соответствует предоставленному шаблону.
- CS8794: выражение типа '{0}' всегда соответствует предоставленному шаблону.
- CS8846: выражение коммутатора не обрабатывает все возможные значения входного типа (это не является исчерпывающим). Например, этот шаблон не рассматривается. Однако шаблон с предложением "when" может успешно соответствовать этому значению.
- CS8918: Ожидается идентификатор или простой доступ к члену.
- CS8978: "..." невозможно сделать допускающим значение NULL.
- CS8979: шаблоны списка могут не использоваться для значения типа "...".
- CS8980: шаблоны среза могут использоваться только один раз и непосредственно внутри шаблона списка.
- CS8985: шаблоны списка могут не использоваться для значения типа "...". Не найдено подходящее свойство Length или Count.
- CS9013: строка "null" не поддерживается в качестве шаблона для "...". Вместо этого используйте пустую строку.
- CS9060: не удается использовать числовые константы или реляционные шаблоны для "..." поскольку он наследует от INumberBase<T> или расширяет его. Рекомендуется использовать шаблон типа для сужения до определенного числового типа.
- CS9134: ветвь выражения не начинается с ключевого слова 'case'.
- CS9135: ожидается константное значение типа
- CS9336: шаблон является избыточным.
- CS9337: шаблон слишком сложный для анализа избыточности.
- CS9344: оператор '==' не поддерживается в шаблоне.
- CS9345: оператор '!=' не поддерживается в шаблоне. Используйте "не" для представления отрицаемого шаблона.
Ошибки синтаксиса выражений переключения
- CS8119: выражение коммутатора должно быть значением; найдено выражение.
- CS8504: отсутствие шаблона
- CS8505: литерал по умолчанию 'default' недопустим в шаблоне. Используйте другой литерал (например, '0' или 'null'). Чтобы сопоставить все, используйте шаблон игнорирования '_'.
- CS8506: для выражения коммутатора не найден лучший тип.
- CS8515: круглые скобки требуются вокруг переключателя, регулирующего выражение.
- CS8523: шаблон отмены не разрешен как метка case в операторе switch. Используйте "case var _:" для шаблона отмены или "case @_:" для константы с именем "_".
- CS9134: ветвь в switch-выражении не начинается с ключевого слова 'case'.
- CS9135: ожидается константное значение типа
- CS9344: оператор '==' не поддерживается в шаблоне.
- CS9345: оператор '!=' не поддерживается в шаблоне. Используйте "не" для представления отрицаемого шаблона.
Укажите значение в качестве управляющего выражения инструкции switch или выражения (CS8119). Управляющее выражение должно производить значение. Типы, пространства имен, группы методов и методы, возвращающие void, недопустимы. Используйте выражение, которое приводит к значению.
Укажите шаблон, в котором ожидается одно (CS8504). Требуется шаблон после соответствующего синтаксиса для переключающей конструкции или выражения is. Убедитесь, что вы включаете допустимое выражение шаблона.
Не используйте default литерал в качестве шаблона (CS8505). Ключевое default слово недопустимо в сопоставлении шаблонов. Используйте конкретное литеральное значение, например 0 или null, или примените паттерн _ отброса, чтобы соответствовать любому значению.
Укажите явный тип для результата выражения коммутатора, если компилятор не может определить оптимальный тип из ветвей (CS8506). Эта ошибка возникает, когда возвращаемые значения ветвей разных типов не имеют общего типа, который компилятор может вывести автоматически, например, группы методов или лямбда-выражения. Назначьте результат явно типизированной переменной вместо использования var.
Заключите управляющее выражение инструкции switch в скобки и тело в фигурные скобки (CS8515). Оператор switch требует круглых скобок вокруг вычисляемого выражения и фигурных скобок вокруг блока кода. Эта ошибка возникает, когда отсутствуют скобки или фигурные скобки.
Используйте case var _: вместо чистого отбрасывания _ в качестве метки case в switch инструкции (CS8523). В конструкциях switch не разрешено использовать шаблон простого отбрасывания из-за неоднозначности с константой с именем _. Используйте case var _: для отмены или case @_: чтобы сопоставить константу с именем _.
Удалите ключевое слово case из ветвей выражения switch. Выражения switch используют другой синтаксис, отличный от инструкций switch (CS9134). В switch-выражениях каждая arm состоит из шаблона, за которым следует токен => и выражение, без ключевого слова case, используемого в инструкциях switch. Используйте константные значения, а не переменные в шаблонах. Для сопоставления шаблонов требуются константы времени компиляции (CS9135). Переменные нельзя использовать в качестве шаблонов. Компилятор должен знать точные значения во время компиляции, чтобы создать соответствующий код сопоставления.
Используйте операторы реляционных шаблонов (<, >, <=, >=) или ключевое слово not вместо операторов == и != в шаблонах (CS9344, CS9345). Операторы равенства и неравенства не поддерживаются в синтаксисе шаблона. Используйте константный шаблон для равенства и ключевое not слово для неравенства.
Дополнительные сведения о правильном синтаксисе см. в разделе "Переключить выражение".
Полнота шаблона и избыточность
- CS8120: случай переключения недоступен. Это уже было обработано предыдущим случаем или невозможно сопоставить.
- CS8509: выражение коммутатора не обрабатывает все возможные значения входного типа (это не является исчерпывающим). Например, шаблон "..." не охватывается.
- CS8510: шаблон недоступен. Он уже был обработан предыдущей рукой выражения коммутатора или невозможно сопоставить.
- CS8518: выражение типа никогда не может соответствовать предоставленному шаблону.
- CS8519: данное выражение никогда не соответствует предоставленному шаблону.
- CS8520: заданное выражение всегда соответствует предоставленной константе.
- CS8524: выражение коммутатора не обрабатывает некоторые значения входного типа (это не является исчерпывающим) с использованием неназванного значения перечисления. Например, отмеченный шаблон не рассматривается.
- CS8793: заданное выражение всегда соответствует предоставленному шаблону.
- CS8794: выражение типа всегда соответствует предоставленному шаблону.
- CS8846: выражение коммутатора не обрабатывает все возможные значения входного типа (это не является исчерпывающим). Например, отмеченный шаблон не рассматривается. Однако шаблон с предложением "when" может успешно соответствовать этому значению.
- CS9336: шаблон является избыточным.
- CS9337: шаблон слишком сложный для анализа избыточности.
Перестановка или удаление недостижимых меток case в switch инструкциях (CS8120). Метка case недоступна, когда предыдущий случай уже обрабатывает все значения, которые будет соответствовать позже. Это происходит, когда перед более конкретным шаблоном отображается более общий шаблон или когда шаблон не может соответствовать типу входных данных.
Добавьте ветви switch, обрабатывающие все возможные входные значения, чтобы создать исчерпывающие выражения switch (CS8509, CS8524, CS8846). Выражения коммутатора должны охватывать все возможные значения входного типа. В противном случае компилятор не может гарантировать, что выражение создает результат для всех входных данных. Компилятор предупреждает отдельно для неименованных значений перечисления (CS8524) и в случаях, когда when условие может совпадать с необработанным значением (CS8846). Используйте шаблон отмены (_) в качестве универсальной ветви catch-all, чтобы сопоставить любые оставшиеся значения, которые не нужно обрабатывать явно.
Переупорядочение или удаление недостижимых ветвей выражения переключателя (CS8510). Как и в случае ошибки CS8120 для switch операторов, эта ошибка указывает, что ветвь выражения switch недостижима, поскольку предыдущая ветвь уже обрабатывает все значения, на которые могла бы соответствовать более поздняя ветвь.
Просмотрите шаблоны, которые никогда не могут совпадать или всегда совпадать с входными данными (CS8518, CS8519, CS8520, CS8793, CS8794). Эти диагностические данные указывают на то, что компилятор может определить на этапе компиляции, совпадает ли шаблон всегда или никогда. Шаблон, всегда совпадающий, является избыточным, а шаблон, никогда не совпадающий, является мертвым кодом. Оба могут указывать на ошибки логики.
Просмотрите шаблоны, которые компилятор определяет как избыточные. Избыточные шаблоны могут указывать на ошибку логики, в которой вы хотите использовать not или другие логические операторы (CS9336). Упростите сложные шаблоны, которые слишком сложны для компилятора, чтобы анализировать их на избыточность. Разбиите их на более простые, более сохраняемые выражения (CS9337).
Дополнительные сведения об исчерпывающих требованиях и оптимизации шаблонов см. в разделе «Выражение switch», «Оператор switch» и «Шаблоны».
Ошибки шаблона типа
- CS8116. Нельзя использовать nullable тип в шаблоне; вместо этого используйте базовый тип.
- CS8117: Недопустимый операнд для сопоставления с шаблоном; требуется значение, но получено выражение.
- CS8121: выражение типа источника не может обрабатываться шаблоном целевого типа.
- CS8208: не является законным использовать тип dynamic в шаблоне.
-
CS8508: в синтаксисе 'var' для шаблона запрещено обращаться к типу, но тип
varнаходится в области видимости. -
CS8513: имя "_" ссылается на тип
_, а не шаблон отмены. Используйте "@_" для типа или var _" для отмены. - CS8521: сопоставление шаблонов не допускается для типов указателей.
- CS8781: реляционные шаблоны могут не использоваться для значения типа.
- CS8782: реляционные шаблоны не могут использоваться для NaN с плавающей запятой.
- CS8978: "..." невозможно сделать допускающим значение null.
- CS9060: не удается использовать числовые константы или реляционные шаблоны для "..." поскольку он наследует от INumberBase<T> или расширяет его. Рекомендуется использовать шаблон типа для сужения до определенного числового типа.
Используйте базовый тип вместо типа NULL в шаблонах (CS8116). Нельзя использовать тип значения NULL, например int? непосредственно в шаблоне типа. Вместо этого используйте базовый тип (int), а шаблон соответствует значениям NULL и ненулевым значениям.
Укажите значение в качестве операнда для сопоставления шаблонов (CS8117). Левая сторона is выражения должна быть значением, а не типом, пространством имен или группой методов. Сначала назначьте результат переменной или используйте другое выражение, которое создает значение.
Используйте тип шаблона, совместимый с типом выражения (CS8121). Компилятор вызывает эту ошибку, если невозможно преобразовать тип выражения и тип шаблона. Например, нельзя сопоставить string выражение с шаблоном int типа. Измените тип шаблона на один из совместимых с выражением или приведите выражение к совместимому типу.
Не используйте dynamic в качестве типа в шаблоне (CS8208). Тип dynamic не поддерживается в сопоставлении шаблонов. Используйте object вместо этого или приведите значение к конкретному типу перед сопоставлением.
Переименуйте тип var или используйте явный тип в шаблоне (CS8508). Если тип с именем var находится в пределах видимости, синтаксис шаблона var является неоднозначным. Компилятор не может определить, планируется ли использовать var шаблон или ссылаться на тип. Используйте полное имя типа или переименуйте тип, чтобы избежать конфликта.
Используйте @_ для ссылки на тип с именем _, или используйте var _ для шаблона отмены (CS8513). Если тип с именем _ определен в области видимости, компилятор не может определить, относится ли _ к типу или это шаблон отмены.
Не используйте сопоставление шаблонов с типами указателей (CS8521). Типы указателей не поддерживаются в выражениях сопоставления шаблонов. Вместо этого используйте явные сравнения или приведения.
Используйте поддерживаемый тип с реляционными шаблонами (CS8781, CS8782). Реляционные шаблоны (<, >, <=) >=работают только с числовыми типами, поддерживающими сравнение. Их нельзя использовать со значениями NaN, так как сравнения NaN всегда дают неопределённый результат false.
Используйте базовый тип непосредственно в шаблонах при работе с типами, которые не могут быть пустыми (CS8978). Такие типы, как System.Nullable<T>, типы указателей и ref-структуры, не могут быть допустимыми для значений NULL. В логике сопоставления шаблонов необходимо использовать базовый тип.
Используйте шаблоны типов для сужения универсальных числовых типов до конкретных числовых типов перед применением числовых констант или реляционных шаблонов (CS9060). Не удается сопоставить универсальные числовые типы, реализующие INumberBase<T> непосредственно с помощью числовых констант или реляционных шаблонов. Компилятор не может определить, какой конкретный числовой тип сопоставляется. Сначала необходимо сузить значение до конкретного числового типа, например int, doubleили decimal.
Для получения дополнительной информации о паттернах типов см. Nullable типы значений, Шаблоны и Обобщенная математика.
Перечисление ошибок шаблона
- CS8979: шаблоны списка могут не использоваться для значения типа "...".
- CS8980: шаблоны среза могут использоваться только один раз и непосредственно внутри шаблона списка.
- CS8985: шаблоны списка могут не использоваться для значения типа "...". Не найдено подходящее свойство Length или Count.
- CS9013: строка "null" не поддерживается в качестве шаблона для "...". Вместо этого используйте пустую строку.
Убедитесь, что тип поддерживает необходимые операции для шаблонов списка. Для шаблонов списка требуются типы, которые являются числимыми и индексируемыми (CS8979, CS8985). Тип должно иметь доступное свойство Length или Count и поддерживать индексирование. Типы среды выполнения, поддерживающие шаблоны списков, включают массивы, List<T>Span<T>и другие типы коллекций с соответствующими элементами.
Поместите шаблоны среза (..) непосредственно в шаблон списка. Используйте их только один раз для каждого шаблона списка, так как они не могут отображаться в вложенных шаблонах или вне шаблонов списка (CS8980).
При сопоставлении типов Span<char> или ReadOnlySpan<char> используйте пустую строку "" вместо строковой константы null. Литерал null не поддерживается в виде шаблона для типов диапазонов (CS9013).
Дополнительные сведения о требованиях к шаблону списка и синтаксисе см. в разделе "Шаблоны списков " и "Шаблоны".
Ошибки подпаттерна
- CS8502: Сопоставление с типом кортежа подразумевает использование подпаттернов, но присутствуют неверные подпаттерны.
- CS8503: подпаттерн свойства требует ссылку на свойство или поле, чтобы выполнить сопоставление, например "{{ Имя: значение }}".
- CS8512: имя "_" относится к константе, а не к шаблону отбрасывания. Используйте 'var _' для отбрасывания значения, или '@_', для ссылки на константу с этим именем.
- CS8516: Название не определяет элемент кортежа.
- CS8517: имя не соответствует соответствующему параметру deconstruct.
- CS8522: имена элементов не допускаются при сопоставлении шаблонов с помощью system.Runtime.CompilerServices.ITuple.
- CS8525: Обозначение переменной должно следовать за шаблоном свойства.
- CS8780: переменная не может быть объявлена в шаблоне "не" или "или".
- CS8918: ожидается идентификатор или простой доступ к члену.
Укажите правильное число подпаттернов при сопоставлении типа кортежа (CS8502). Число подпаттернов в позиционном паттерне должно соответствовать количеству элементов в типе кортежа. Добавьте или удалите подпаттерны, чтобы соответствовать арности кортежа.
Включите свойство или имя поля в подпаттерны свойств (CS8503). Каждый подпаттерн свойства должен указать, какое свойство или поле должно соответствовать. Используйте синтаксис { PropertyName: pattern } для идентификации элемента.
Используйте var _ для шаблона игнорирования или @_ для константы с именем _ (CS8512). Если имя константы _ находится в области видимости, голая _, находящаяся в case метке, ссылается на константу. Чтобы использовать шаблон отбрасывания, выполните запись var _.
Используйте правильные имена элементов в позиционных паттернах для кортежей (CS8516) и деконструируемых типов (CS8517). При именовании подпаттернов в позиционном шаблоне имена должны совпадать с именами элементов кортежа или Deconstruct именами параметров метода.
Не используйте имена элементов в позиционных шаблонах при сопоставлении через ITuple (CS8522). Если тип сопоставляется через ITuple интерфейс, а не через Deconstruct метод, именованные элементы отсутствуют. Удалите имена элементов из шаблона.
Поместите обозначение переменной после шаблона свойства, а не перед ним (CS8525). В шаблоне свойств с обозначением переменной имя переменной должно соответствовать закрывающей скобке шаблона. Например, запись { Length: > 0 } s , а не s { Length: > 0 }.
Нельзя объявлять переменные в шаблонных комбинаторах not или or (CS8780). Объявления переменных в шаблонах not не назначаются явно, а переменные в шаблонах or назначаются только в одной ветви. Переместите объявление переменной за пределы комбинатора шаблонов.
Используйте идентификатор или выражение для простого доступа к членам в качестве имен свойств в шаблонах свойств и позиционных подшаблонах (CS8918). Сложные выражения, вызовы методов или другие несложные доступы к членам не могут быть использованы как левая часть подшаблона свойства. Каждое имя подпаттерна должно быть именем поля или прямым свойством, или точечным путем доступа, например Property.SubProperty.
Дополнительные сведения о синтаксисе подпаттерна см. в разделе "Шаблон свойств " и "Позиционный шаблон".