Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматриваются следующие ошибки компилятора:
- CS0080: Ограничения не допускаются для необобщённых деклараций.
- CS0081: объявление параметров типа должно быть идентификатором, а не типом.
- CS0224: метод с vararg не может быть универсальным, быть в универсальном типе или иметь параметр params.
-
CS0304: не удается создать экземпляр типа переменной, так как он не имеет
new()ограничения. - CS0305: для использования универсального типа требуются аргументы типа N.
- CS0306: тип не может использоваться в качестве аргумента типа.
- CS0307: идентификатор нельзя использовать с аргументами типа.
- CS0308: Необобщённый тип или метод нельзя использовать с аргументами типа.
- CS0310: тип должен быть не абстрактным типом с открытым конструктором без параметров, чтобы использовать его в качестве параметра в универсальном типе или методе.
-
CS0311: Тип не может быть использован в качестве параметра типа
Tв универсальном типе или методе. Не существует неявного ссылочного преобразования из 'type1' в 'type2'. - CS0312: Тип "type1" не может использоваться в качестве параметра типа в универсальном типе или методе. Тип "type1", допускающий значение NULL, не удовлетворяет ограничению "constraint".
- CS0313: Тип "type1" нельзя использовать в качестве параметра типа в обобщённом типе или методе. Допускающий значение NULL тип "type1" не удовлетворяет ограничению "constraint". Типы, допускающие значение NULL, не могут удовлетворять ограничениям интерфейса.
- CS0314: Тип нельзя использовать в качестве параметра типа в универсальном типе или методе. Не существует ни преобразования упаковки, ни преобразования параметра типа из "type" в "constraint".
-
CS0315: Тип не может использоваться в качестве параметра типа
Tв обобщённом типе или методе. Не существует преобразования упаковки из 'type' в 'constraint'. -
CS0401:
new()ограничение должно быть последним ограничением, указанным. -
CS0403: не удается преобразовать значение NULL в параметр типа, так как это может быть ненулевой тип значения. Вместо этого рекомендуется использовать
default(T). - CS0405: повторяющееся ограничение для параметра типа.
- CS0406: Ограничение типа класса "constraint" должно предшествовать любым другим ограничениям.
- CS0409: предложение ограничения уже указано для параметра типа "type parameter". Все ограничения для параметра типа должны быть указаны в одном предложении where.
- CS0411: аргументы типа для метода "method" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.
- CS0412: параметр: параметр, локальная переменная или локальная функция не могут иметь то же имя, что и параметр типа метода.
-
CS0413: параметр типа нельзя использовать с
asоператором, так как он не имеет ограничения типа класса илиclassограничения. - CS0417: идентификатор: не может предоставлять аргументы при создании экземпляра переменной типа.
-
CS0449: Ограничения
class,struct,unmanaged,notnullиdefaultне могут быть объединены или дублированы и должны быть сначала указаны в списке ограничений. -
CS0450: параметр type: не может указывать как класс ограничений, так и
classstructограничение. -
CS0451:
new()ограничение нельзя использовать с ограничениемstruct. - CS0452: Тип "имя типа" должен быть ссылочным типом, чтобы его можно было использовать в качестве параметра "имя параметра" в универсальном типе или методе "generic".
- CS0453: Тип "имя типа" должен быть типом значения, не допускающим значения NULL, чтобы его можно было использовать в качестве параметра "имя параметра" в универсальном типе или методе "generic".
- CS0454: зависимость с циклическим ограничением, включающая параметр типа 1 и параметр типа 2.
- CS0455: параметр типа наследует конфликтующие ограничения "constraint1" и "constraint2".
- CS0456: параметр type "type parameter 1" имеет ограничение "структур", поэтому параметр типа 1 не может использоваться в качестве ограничения для "type parameter 2".
- CS0693: Параметр типа "type parameter" имеет то же имя, что и параметр типа во внешнем типе "type".
- CS0694: параметр type имеет то же имя, что и содержащий тип или метод.
- CS0695: type не может реализовать как interface1, так и interface2, так как они могут объединиться для некоторых подстановок параметров типа.
- CS0698: универсальный тип не может быть производным от типа, так как это класс атрибутов.
- CS0699: "generic" не определяет параметр типа "идентификатор".
- CS0701: "идентификатор" не является допустимым ограничением. Тип, используемый в качестве ограничения, должен быть интерфейсом, непечатанным классом или параметром типа.
- CS0702: ограничение не может быть специальным классом.
- CS0703: Несогласованная доступность: тип ограничения менее доступен, чем объявление.
- CS0704: Не удается выполнить поиск невиртуального члена в "type", так как это параметр типа.
- CS0706: недопустимый тип ограничения. Тип, используемый в качестве ограничения, должен быть интерфейсом, непечатанным классом или параметром типа.
- CS0717: статический класс: статические классы нельзя использовать в качестве ограничений.
- CS0718: type: статические типы нельзя использовать в качестве аргументов типов.
- CS1720: выражение всегда вызывает значение System.NullReferenceException, так как значение по умолчанию универсального типа имеет значение NULL.
- CS1763: параметр имеет тип "type". Значение параметра по умолчанию ссылочного типа, отличного от строки, можно инициализировать только с значением NULL.
- CS1948: переменная диапазона "name" не может иметь то же имя, что и параметр типа метода.
- CS1960: недопустимый модификатор дисперсии. В качестве варианта можно указать только параметры интерфейса и делегата.
- CS1961: недопустимая дисперсия: параметр типа должен быть ковариантно допустимым для типа. Параметр type является контравариантным.
- CS3024: тип ограничения "type" не соответствует CLS.
- CS7002: неожиданное использование универсального имени.
- CS8322: не удается передать аргумент с динамическим типом в универсальную локальную функцию с аргументами выводимых типов.
- CS8375: ограничение new()нельзя использовать с ограничением "неуправляемый".
- CS8377: Тип "type" должен быть типом значения, не допускающим значения NULL, как и все поля на любом уровне вложенности, чтобы его можно было использовать в качестве параметра "parameter" в обобщённом типе или методе "generic".
- CS8379: параметр type "type parameter 1" имеет ограничение "неуправляемый", поэтому "тип параметра 1" нельзя использовать в качестве ограничения для "type parameter 2".
- CS8380: type: не может указывать как класс ограничения, так и ограничение "неуправляемый".
- CS8387: тип параметра type имеет то же имя, что и параметр типа из внешнего метода method.
- CS8389: пропуск аргумента типа запрещено в текущем контексте.
- CS8427: Перечисления, классы и структуры нельзя объявлять в интерфейсе с параметром типа "in" или "out".
- CS8665: Метод "method" задаёт ограничение "class" для параметра типа "type parameter", но соответствующий параметр типа "type parameter" переопределённого или явно реализованного метода "method" не является ссылочным типом.
- CS8666: Метод "method" задает ограничение "struct" для параметра типа "type parameter", но соответствующий параметр типа "type parameter" переопределяемого или явно реализуемого метода "method" не является типом значения, не допускающим значения NULL.
- CS8822: метод "method" задает ограничение по умолчанию для параметра type "type parameter", но соответствующий параметр типа "параметр типа" переопределенного или явно реализованного метода "method" ограничен ссылочным типом или типом значения.
- CS8823: Ограничение 'default' допустимо только для методов-переопределений и методов явной реализации интерфейса.
- CS8893: 'type' не является допустимым типом соглашения о вызове для 'UnmanagedCallersOnly'.
- CS8894: Не удается использовать "тип" в качестве типа параметра или возвращаемого типа в методе, помеченном атрибутом "UnmanagedCallersOnly".
- CS8895: Методы, помеченные атрибутом "UnmanagedCallersOnly", не могут иметь параметры обобщённого типа и не могут быть объявлены в обобщённом типе.
- CS8896: UnmanagedCallersOnly может применяться только к обычным статическим не абстрактным, не-виртуальным методам или статическим локальным функциям.
-
CS9011: Ключевое слово
delegateнельзя использовать в качестве ограничения. Вы имели в видуSystem.Delegate? -
CS9012: Неожиданное ключевое слово
record. Вы имели в видуrecord structилиrecord class? - CS9338: Несоответствующая доступность: тип менее доступен, чем класс.
Объявление и именование параметров типа
- CS0080: ограничения не допускаются для не универсальных объявлений.
- CS0081: объявление параметров типа должно быть идентификатором, а не типом.
- CS0412: параметр: параметр, локальная переменная или локальная функция не могут иметь то же имя, что и параметр типа метода.
- CS0693: Параметр типа "type parameter" имеет то же имя, что и параметр типа из внешнего типа "type".
- CS0694: параметр type имеет то же имя, что и содержащий тип или метод.
- CS0699: "generic" не определяет параметр типа "идентификатор".
- CS1948: переменная диапазона "name" не может иметь то же имя, что и параметр типа метода.
- CS8387: тип параметра type имеет то же имя, что и параметр типа из внешнего метода method.
-
CS9012: неожиданное ключевое слово
record. Вы имели в видуrecord structилиrecord class?
Эти ошибки связаны с тем, как вы объявляете параметры типа и задаёте им имена в универсальных типах и методах. Имена параметров типа должны быть допустимыми идентификаторами, не должны конфликтовировать с другими идентификаторами в области и должны отображаться в списке параметров типа объявления.
- Удалите условие ограничения из необобщённых объявлений (CS0080). Предложение
whereможно использовать только для универсальных типов и методов, объявляющих параметры типа. Если необходимо применить ограничения, сначала добавьте параметры типа в объявление типа или метода. - Замените фактические имена типов идентификаторами в объявлениях параметров типа (CS0081). Необходимо объявить параметры типа с помощью идентификаторов (например
T,TKeyилиTValue) вместо конкретных типов (напримерint, илиstring). Назначение параметра типа — служить заполнителем, который компилятор заменяет фактическими типами при использовании универсального типа или метода. - Переименуйте параметры типа, локальные переменные, параметры или переменные диапазона, чтобы избежать конфликтов именования (CS0412, CS0694, CS1948). Имена параметров типа не могут скрывать идентификаторы в той же области видимости, а также не могут совпадать с именем содержащего типа или метода. Переменные диапазона LINQ также не могут повторно использовать имя параметра типа метода. Такие конфликты создают неоднозначность о том, на какой идентификатор ссылается.
- Используйте другое имя для параметров внутреннего типа, скрывающих внешние (CS0693, CS8387). Если универсальный член (например, метод или вложенный тип) находится внутри универсального класса или метода, параметр внутреннего типа не обязательно совпадает с внешним. Если дать им одинаковое имя, возникнет путаница относительно того, какой параметр типа имеется в виду. Используйте отдельное имя для параметра внутреннего типа.
- Убедитесь, что все параметры типа в предложениях ограничений объявляются в списке параметров типа (CS0699). Предложение
whereможет ссылаться только на параметры типа, которые отображаются в универсальном объявлении. Если имя в предложении не соответствует ни одному объявленномуwhereпараметру типа, проверьте наличие опечаток или ошибок. - Используйте правильный синтаксис объявления записей (CS9012). При объявлении типа записи необходимо использовать
record classилиrecord struct(или толькоrecordдля ссылочного типа).recordключевое слово само по себе не может использоваться в тех местах, где компилятор ожидает другой синтаксис объявления.
Дополнительные сведения см. в разделе "Параметры универсального типа " и "Универсальные типы".
Объявление ограничений и порядок
-
CS0401:
new()ограничение должно быть последним ограничением, указанным. - CS0406: Ограничение типа class "constraint" должно предшествовать любым другим ограничениям.
- CS0409: предложение ограничения уже указано для параметра типа "type parameter". Все ограничения для параметра типа должны быть указаны в одном предложении where.
-
CS0449: Ограничения
class,struct,unmanaged,notnullиdefaultне могут быть объединены или дублированы и должны быть указаны первыми в списке ограничений. -
CS0450: параметр type: не может указывать как класс ограничений, так и
classstructограничение. -
CS0451: Ограничение
new()нельзя использовать с ограничениемstruct. - CS8375: ограничение new()нельзя использовать с ограничением "неуправляемый".
- CS8380: type: не может указывать как класс ограничения, так и ограничение "неуправляемый".
-
CS9011: ключевое слово
delegateнельзя использовать в качестве ограничения. Вы имели в видуSystem.Delegate?
Ограничения параметров типа должны соответствовать определенному порядку: первичные ограничения (class,, structunmanagednotnull, илиdefault) приходят первым, а затем ограничение типа класса, а затем ограничения интерфейса и, наконецnew(), ограничение конструктора. Некоторые ограничения являются взаимоисключающими и не могут быть объединены. Все ограничения для одного параметра типа должны отображаться в одном where предложении.
- Поместите
new()ограничение в конец списка ограничений (CS0401). Ограничениеnew()должно отображаться после всех других ограничений. Например, изменитеwhere T : new(), IDisposableнаwhere T : IDisposable, new(). - Поместите ограничение типа класса перед ограничениями интерфейса (CS0406). При ограничении параметра типа на определенный базовый класс вместе с интерфейсами класс должен отображаться сначала. Например, измените
where T : IDisposable, MyBaseClassнаwhere T : MyBaseClass, IDisposable. - Объединить все ограничения для параметра типа в одно
whereпредложение (CS0409). Для одного параметра типа нельзя использовать несколькоwhereпредложений. Объедините их в одну часть предложения: заменитеwhere T : I where T : new()наwhere T : I, new(). Несколькоwhereпредложений допустимы только в том случае, если они предназначены для разных параметров типа. - Сначала поместите основные ограничения и не сочетайте взаимоисключающие ограничения (CS0449). В списке ограничений можно указать не более одного из
class,struct,unmanaged,notnullилиdefault, и он должен появиться первым. Ограниченияclassявляются взаимоисключающими, как иstructclass.unmanaged - Не сочетайте определенное ограничение класса с
classstruct, илиunmanaged(CS0450, CS8380). Если параметр типа ограничен конкретным типом класса, он неявно является ссылочным типом, что противоречит ограничениюstructилиunmanaged. Удалите ограничение класса или основное ограничение. - Не сочетайте
new()илиstructunmanaged(CS0451, CS8375). Все типы значений неявно имеют открытый конструктор без параметров, поэтомуnew()ограничение избыточно при сочетании сstruct. То же самое относится кunmanaged, что подразумеваетstruct.new()Удалите ограничение. - Замените
delegateнаSystem.Delegateв предложениях ограничений (CS9011). Ключевоеdelegateслово используется для объявления типов делегатов, а не в качестве ограничения. Чтобы ограничить параметр типа делегированным типам, используйтеSystem.Delegateв качестве типа ограничения.
Дополнительные сведения см. в статье Ограничения параметров типа.
Допустимые типы ограничений
- CS0405: повторяющееся ограничение для параметра типа.
- CS0701: "идентификатор" не является допустимым ограничением. Тип, используемый в качестве ограничения, должен быть интерфейсом, непечатанным классом или параметром типа.
- CS0702: ограничение не может быть специальным классом.
- CS0703: Несогласованная доступность: тип ограничения менее доступен, чем объявление.
- CS0706: недопустимый тип ограничения. Тип, используемый в качестве ограничения, должен быть интерфейсом, непечатанным классом или параметром типа.
- CS0717: статический класс: статические классы нельзя использовать в качестве ограничений.
- CS3024: тип ограничения "type" не соответствует CLS.
Ограничение должно быть интерфейсом, непечатанным классом или параметром типа. Некоторые типы недопустимы в качестве ограничений из-за их специального значения в системе типов .NET или из-за того, что они не могут быть унаследованы.
- Удалите повторяющиеся ограничения (CS0405). Каждое ограничение может отображаться только один раз в предложении ограничения. Если у вас есть
where T : I, I, удалите дубликат. - Используйте только незапечатанные типы в качестве ограничений (CS0701). Запечатанные классы, структуры и перечисления не могут быть унаследованы, поэтому они не служат ни для каких целей в качестве ограничений. Используйте интерфейс, который реализуют требуемые типы, или незакрытый базовый класс.
- Не используйте специальные классы в качестве ограничений (CS0702). Типы Objectи ArrayValueType не могут использоваться в качестве ограничений. Каждый тип уже является производным от
Object, поэтому ограничение для него не предоставляет никакого значения.ArrayиValueTypeявляются абстрактными базовыми типами, которые нельзя наследовать напрямую. Если требуется поведение массива, используйтеIList<T>илиIEnumerable<T>вместо этого. - Убедитесь, что типы ограничений не менее доступны, чем универсальный тип (CS0703). Общедоступный универсальный тип не может иметь ограничений с использованием внутренних типов, так как внешний код не сможет предоставлять допустимые аргументы типа. Либо сделать тип ограничения общедоступным, либо уменьшить доступность универсального типа.
- Используйте только интерфейсы, непечатанные классы или параметры типа в качестве ограничений (CS0706). Нельзя использовать массивы, запечатанные классы, структуры, перечисления или другие недопустимые типы в качестве ограничений. Рекомендуется использовать интерфейс, реализующий нужные типы.
- Не используйте статические классы в качестве ограничений (CS0717). Статические классы нельзя расширить, так как они содержат только статические элементы. Тип не может быть производным от статического класса, что делает его бесполезным в качестве ограничения.
- Используйте тип, совместимый с CLS, для ограничения типа (CS3024). Если сборка помечена атрибутом
[assembly: CLSCompliant(true)], использование типа, не совместимого с CLS, в качестве ограничения параметра типа может сделать невозможным использование вашего универсального класса кодом, написанным на некоторых языках.
Дополнительные сведения см. в статье Ограничения параметров типа.
Удовлетворение ограничений и преобразования
-
CS0311: Тип нельзя использовать в качестве параметра типа
Tв обобщённом типе или методе. Не существует неявного ссылочного преобразования из 'type1' в 'type2'. - CS0312: Тип нельзя использовать в качестве параметра типа в обобщённом типе или методе. Тип, допускающий значение NULL, не удовлетворяет ограничению «constraint».
- CS0313: Этот тип нельзя использовать в качестве параметра типа в универсальном классе или методе. Тип, допускающий значение NULL, не удовлетворяет ограничению "constraint". Типы, допускающие значение NULL, не могут удовлетворять никаким ограничениям интерфейса.
- CS0314: тип нельзя использовать в качестве параметра типа в универсальном типе или методе. Преобразование в бокс или преобразование параметров типа из типа в тип в "ограничение" отсутствует.
-
CS0315: Тип нельзя использовать в качестве параметра типа
Tв универсальном типе или универсальном методе. Не существует преобразования упаковки из "type" в "constraint". - CS0452: Тип "имя типа" должен быть ссылочным типом для использования его в качестве параметра "имя параметра" в универсальном типе или методе "generic".
- CS0453: Тип "имя типа" должен быть типом значений, не допускающим значения NULL, чтобы использовать его в качестве параметра "имя параметра" в универсальном типе или методе "generic".
- CS8377: Тип "type" должен быть типом значения, не допускающим значение null, как и все поля на любом уровне вложенности, чтобы его можно было использовать в качестве параметра "parameter" в универсальном типе или методе "generic".
Эти ошибки возникают, когда аргумент типа не удовлетворяет ограничениям, объявленным в параметре универсального типа. Аргумент типа должен иметь правильные преобразования, связи наследования и структурные свойства, чтобы соответствовать всем ограничениям.
- Измените аргумент типа на тот, который имеет неявное преобразование ссылок на тип ограничения (CS0311). Если параметр типа имеет ограничение, например
where T : BaseType, то любой аргумент типа должен быть преобразуем вBaseTypeчерез неявное преобразование ссылок или тождественное преобразование. Неявные числовые преобразования (например, изshortвint) не удовлетворяют ограничениям параметров обобщённых типов. - Используйте типы значений, не допускающие значение NULL, или измените тип ограничения (CS0312, CS0313). Типы значений, допускающие значение NULL (например
int?, отличаются от их базовых типов значений и не удовлетворяют тем же ограничениям). Типы значений, допускающие значение NULL, не могут удовлетворять ограничениям интерфейса, так как сам оболочка, допускающая значение NULL, не реализует интерфейс. Используйте форму типа значения, не допускающую null, в качестве аргумента типа. - Повторите ограничения параметров типа базового класса в любом объявлении производного класса (CS0314). Если производный универсальный класс наследует от ограниченного базового универсального класса, производный класс должен объявить те же ограничения для соответствующих параметров типа.
- Убедитесь, что аргументы типов удовлетворяют ограничениям ссылочного типа или класса (CS0315). Если параметр типа ограничен типом класса, нельзя использовать тип значения (структуру) в качестве аргумента типа, поскольку не существует преобразования упаковки, удовлетворяющего этому ограничению. Используйте ссылочный тип, наследующий или реализующий ограничение.
- Используйте ссылочный тип в качестве аргумента типа при указании
classограничения (CS0452). Типы значенийstruct, такие какintилиclassне могут удовлетворить ограничение. Измените аргумент типа на ссылочный тип или удалитеclassограничение, если универсальный тип может работать с типами значений. - Используйте ненулевой тип значения в качестве аргумента типа при
structуказании ограничения (CS0453). Ссылочные типы, типы значений, допускающие NULL (int?), и другие типы, не являющиеся типами значений, не могут соответствовать ограничениюstruct. Используйте конкретный, ненулевой тип значения, напримерint,doubleили определяемыйstructпользователем. - Используйте тип, поля которого являются неуправляемыми типами при
unmanagedуказании ограничения (CS8377). Ограничениеunmanagedтребует, чтобы тип значения не допускал значения NULL и чтобы каждое его поле на любом уровне вложенности также было неуправляемым типом. Типы, содержащие поля ссылочного типа или параметры универсального типа, которые не известны как неуправляемые, не удовлетворяют этому ограничению.
Дополнительные сведения см. в статье Ограничения параметров типа.
Конфликты ограничений и циклические зависимости
- CS0454: зависимость с циклическим ограничением, включающая параметр типа 1 и параметр типа 2.
- CS0455: параметр типа наследует конфликтующие ограничения "constraint1" и "constraint2".
- CS0456: параметр type "type parameter 1" имеет ограничение "структур", поэтому параметр типа 1 не может использоваться в качестве ограничения для "type parameter 2".
- CS8379: параметр type "type parameter 1" имеет ограничение "неуправляемый", поэтому "тип параметра 1" нельзя использовать в качестве ограничения для "type parameter 2".
Ограничения не могут создавать циклические зависимости, а параметры типа не могут наследовать конфликтующие ограничения, которые невозможно удовлетворить одновременно. Ограничения типов значений (struct и unmanaged) неявно запечатываются, поэтому их нельзя использовать в качестве ограничений для других параметров типа.
- Удалите зависимости кругового ограничения (CS0454). Параметр типа не может напрямую или косвенно зависеть от себя с помощью ограничений. Например,
where T : U where U : Tсоздает циклическую зависимость. Разорвать цикл, удалив одно из ограничений. - Удалите конфликтующие наследуемые ограничения (CS0455). Параметр типа не может быть ограничен несколькими несвязанными классами, так как C# не поддерживает наследование нескольких классов. Аналогичным образом он не может иметь ограничения одновременно на
structи на тип класса. Переструктурируйте иерархию типов или удалите одно из конфликтующих ограничений. - Не используйте параметр типа с ограничением
structили параметр типа с ограничениемunmanagedв качестве ограничения для другого параметра типа (CS0456, CS8379). Ограничения типов значений неявно запечатываются, поэтому другие типы не могут быть производными от них. Чтобы устранить эту ошибку, поместите тип значения или неуправляемое ограничение непосредственно во второй параметр типа вместо косвенного ограничения через первый параметр типа.
Дополнительные сведения см. в статье Ограничения параметров типа.
Правила переопределения и ограничения реализации
- CS8665: Метод "method" задаёт ограничение "class" для параметра типа "type parameter", но соответствующий параметр типа "type parameter" переопределённого или явно реализованного метода "method" не является ссылочным типом.
- CS8666: Метод "method" задаёт ограничение "struct" для параметра типа "type parameter", но соответствующий параметр типа "type parameter" переопределённого или явно реализованного метода "method" не является типом значения, не допускающим null.
- CS8822: Метод "method" задает ограничение "default" для параметра типа "type parameter", но соответствующий параметр типа "type parameter" переопределенного или явно реализованного метода "method" ограничен ссылочным типом или типом значения.
- CS8823: Ограничение 'default' допустимо только в методах переопределения и методах явной реализации интерфейса.
При переопределении виртуального метода или явном реализации метода интерфейса ограничения параметров типа переопределения метода должны быть совместимы с ограничениями базового метода. Ограничение default — это специальный модификатор, используемый только в сценариях переопределения и явной реализации интерфейса, чтобы указать, что параметр типа не имеет ни classstruct ограничения.
- Убедитесь, что ограничения переопределения метода соответствуют ограничениям базового метода (CS8665, CS8666). Переопределение не может добавить ограничение
class, если соответствующий параметр типа базового метода не ограничен ссылочным типом. Аналогичным образом он не может добавитьstructограничение, если параметр типа базового метода не ограничен типом значения. Переопределение должно быть совместимо с базовым объявлением. -
defaultИспользуйте ограничение, только если параметр типа базового метода не ограничен (CS8822). Ограничениеdefaultуказывает, что параметр типа не имеет ограниченияclassилиstruct. Невозможно применитьdefault, если соответствующий параметр типа переопределенного метода уже имеетclassилиstructограничение. - Используйте ограничение
defaultтолько в методах переопределения или методах явной реализации интерфейса (CS8823). Ограничениеdefaultнедопустимо в обычных объявлениях методов. Он существует специально для устранения неоднозначности при переопределении метода, если в базовом методе есть параметр типа без ограничений, и нужно указать, что в переопределённом методе он также остаётся без ограничений.
Для получения дополнительной информации см. раздел «Ограничения для параметров типов» и default ограничение.
Ограничения конструктора
-
CS0304: не удается создать экземпляр типа переменной, так как он не имеет
new()ограничения. - CS0310: тип должен быть не абстрактным типом с открытым конструктором без параметров, чтобы использовать его в качестве параметра в универсальном типе или методе.
- CS0417: идентификатор: не может предоставлять аргументы при создании экземпляра переменной типа.
Эти ошибки относятся к ограничению new() и созданию экземпляров параметров типа с помощью оператора new.
- Добавьте ограничение
new()к параметрам типа, экземпляры которых необходимо создавать (CS0304). При использованииnew T()внутри универсального типа или метода компилятор должен гарантировать, что любой аргумент типа имеет конструктор без параметров. Этоnew()ограничение обеспечивает эту гарантию. - Убедитесь, что аргументы типа имеют открытые конструкторы без параметров (CS0310). Если параметр типа имеет
new()ограничение, любой конкретный тип, используемый в качестве аргумента типа, должен быть не абстрактным и должен предоставлять открытый конструктор без параметров. Типы с только частными, защищенными или параметризованными конструкторами не могут удовлетворитьnew()ограничение. - Удалите аргументы конструктора при инициализации типовых параметров (CS0417). Ограничение
new()гарантирует только конструктор без параметров. Невозможно передать аргументы вnew T(arguments). Если необходимо создать экземпляры с определенными аргументами, рассмотрите возможность использования шаблона фабрики или ограничения интерфейса, определяющего поведение построения.
Для получения дополнительной информации см. раздел «Ограничения для параметров типов» и new() ограничение.
Количество аргументов типа и использование
- CS0224: метод с vararg не может быть универсальным, быть в универсальном типе или иметь параметр params.
- CS0305: для использования универсального типа требуются аргументы типа N.
- CS0306: тип не может использоваться в качестве аргумента типа.
- CS0307: идентификатор нельзя использовать с аргументами типа.
- CS0308: Не являющийся универсальным тип или метод нельзя использовать с аргументами типа.
- CS7002: неожиданное использование универсального имени.
- CS8389: пропуск аргумента типа запрещено в текущем контексте.
Эти ошибки связаны с предоставлением правильного числа и типа аргументов универсальным типам и методам.
- Удалите параметры универсального типа или содержащие объявления универсальных типов из методов, использующих
__arglist(CS0224). Ключевое__arglistслово несовместимо с универсальными шаблонами, так как механизмы среды выполнения для обработки списков аргументов переменной конфликтуют с подстановкой типов, необходимой для параметров универсального типа. - Укажите точное число аргументов типа, указанных в универсальном объявлении (CS0305). Каждый параметр универсального типа в определении должен иметь соответствующий аргумент типа при создании экземпляра универсального типа.
- Используйте только допустимые типы в качестве аргументов типа (CS0306). Типы указателей (например,
int*илиchar*) нельзя использовать в качестве аргументов типа, поскольку обобщённые типы требуют управляемых типов, которые может отслеживать сборщик мусора. - Удалите синтаксис аргумента типа из не универсальных конструкций (CS0307, CS0308). Аргументы типа, заключенные в угловые скобки, могут применяться только к универсальным типам и методам, объявляющим параметры типа. Убедитесь, что вы импортировали пространство имен, содержащее универсальную версию типа.
- Удалите параметры типа из объявлений, которые не поддерживают обобщения (CS7002). Некоторые конструкции, такие как перечисления, не могут быть обобщёнными. Если вам нужен универсальный контейнер для перечисляемых значений, рассмотрите возможность использования универсального класса или структуры.
- Укажите все аргументы обязательных типов явным образом (CS8389). В некоторых контекстах, таких как использование
typeofоператора или создание делегатов, необходимо указать все аргументы типа и не упустить их. Например, используйтеtypeof(List<int>)вместо попытки опустить аргумент типа.
Дополнительные сведения см. в разделе "Параметры универсального типа " и "Универсальные типы".
Вывод аргументов типа
- CS0411: аргументы типа для метода "method" не могут быть выведены из использования. Попробуйте явно указать аргументы типа.
Эта ошибка возникает при вызове универсального метода без явного предоставления аргументов типа, и компилятор не может определить, какие аргументы типа вы планируете. Компилятор выводит аргументы типа из типов аргументов метода, передаваемых при вызове.
- Укажите аргументы типа явно в угловых скобках (CS0411). Если компилятор не может определить аргументы типа из аргументов метода, предоставьте их напрямую. Например, измените
G()наG<int>(). Эта ошибка обычно возникает, когда универсальный метод не имеет параметров, из которых следует выводить тип, или когдаnullаргумент передается, и компилятор не может определить предполагаемый тип.
Дополнительные сведения см. в разделе "Универсальные методы".
Вариантность параметров типа
- CS1960: недопустимый модификатор дисперсии. В качестве варианта можно указать только параметры интерфейса и делегата.
- CS1961: недопустимая дисперсия: параметр типа должен быть ковариантно допустимым для типа. Параметр type является контравариантным.
- CS8427: Перечисления, классы и структуры нельзя объявлять в интерфейсе, имеющем параметр типа 'in' или 'out'.
Модификаторы дисперсии (in для контравариантности, out для ковариантности) определяют, как можно использовать параметры типов в объявлениях интерфейсов и делегатов. Только интерфейсы и делегаты поддерживают дисперсию. Параметр типа ковариантного (out) может отображаться только в выходных позициях (возвращаемых типах), а параметр типа контравариантного (in) может отображаться только в входных позициях (типах параметров).
- Используйте модификаторы дисперсии только в параметрах типа интерфейса и делегата (CS1960). Классы, структуры и другие объявления типов не поддерживают модификаторы дисперсии. Только объявления
interfaceиdelegateмогут использоватьinилиoutдля своих параметров типа. - Используйте
out(ковариант) для параметров типа, которые отображаются только в возвращаемых типах, иin(contravariant) для параметров типа, которые отображаются только в типах параметров (CS1961). Если параметр типа должен отображаться как в входных, так и в выходных позициях, удалите модификатор дисперсии. - Не объявляйте перечисления, классы или структуры в вариантном интерфейсе (CS8427). Объявления вложенных типов внутри интерфейса, имеющего параметры типа
inилиout, не допускаются, так как они могут нарушать правила безопасности вариантности. Переместите вложенный тип за пределы объявления интерфейса.
Дополнительные сведения см. в разделе «Ковариация и контравариантность в универсальных шаблонах».
Ограничения использования универсального типа
-
CS0403: не удается преобразовать значение NULL в параметр типа, так как это может быть ненулевой тип значения. Вместо этого рекомендуется использовать
default(T). -
CS0413: параметр типа нельзя использовать с
asоператором, так как он не имеет ограничения типа класса илиclassограничения. - CS0695: type не может реализовать как interface1, так и interface2, так как они могут объединиться для некоторых подстановок параметров типа.
- CS0698: универсальный тип не может быть производным от типа, так как это класс атрибутов.
- CS0704: не удается выполнить поиск не-виртуальных элементов в типе, так как он является параметром типа.
- CS0718: type: статические типы нельзя использовать в качестве аргументов типов.
- CS1720: выражение всегда вызывает значение System.NullReferenceException, так как значение по умолчанию универсального типа имеет значение NULL.
- CS1763: параметр имеет тип "type". Значение параметра по умолчанию ссылочного типа, отличного от строки, можно инициализировать только с значением NULL.
- CS8322: не удается передать аргумент с динамическим типом в универсальную локальную функцию с аргументами выводимых типов.
- CS9338: Несоответствующая доступность: тип менее доступен, чем класс.
Эти ошибки связаны с ограничениями на использование универсальных типов и параметров типа в выражениях, наследовании и доступе к членам.
- Замените присваивания
nullнаdefault(T)или добавьте ограничениеclass(CS0403). При назначенииnullпараметру без ограничений компилятор не может гарантировать, что аргумент типа является ссылочным типом. Используйтеdefault(T), который предоставляет подходящее значение по умолчанию для любого типа, или добавьте ограничениеclass, если вам требуется семантика ссылочных типов. - Добавьте
classили конкретное ограничение типа при использованииasоператора (CS0413). Операторasвозвращаетnull, если преобразование не удаётся, но типы значений не могут иметь значениеnull.classДобавьте ограничение, чтобы гарантировать, что параметр типа всегда является ссылочным типом. - Избегайте реализации одного и того же универсального интерфейса несколько раз с параметрами типа, которые могут быть объединены (CS0695). Если класс реализует универсальный интерфейс несколько раз с разными параметрами типа (например
class G<T1, T2> : I<T1>, I<T2>), создание экземпляра с одинаковым типом для обоих параметров приведет к конфликту. Реализуйте интерфейс только один раз или реструктурировать, чтобы предотвратить объединение. - Удалите параметры универсального типа из классов атрибутов (CS0698). Эта ошибка больше не создается в текущих версиях C#, так как теперь поддерживаются универсальные атрибуты.
- Используйте конкретный тип-ограничение вместо параметра типа для доступа к вложенным элементам (CS0704). Не удается получить доступ к вложенным типам или не виртуальным членам с помощью параметра типа. Вместо этого
T.InnerTypeиспользуйте известный тип ограничения напрямую, напримерBaseClass.InnerType. - Не используйте статические типы в качестве аргументов типа (CS0718). Статические типы нельзя создать экземпляр и нельзя использовать в качестве универсальных аргументов. Удалите статический тип из универсального аргумента.
- Избегайте вызова членов экземпляра у
default(T), еслиTограничен ссылочным типом (CS1720). ЕслиTимеет ограничениеclass,default(T)являетсяnull, поэтому обращение к его членам экземпляра всегда вызывает исключение NullReferenceException. Добавьте проверку на значение NULL перед обращением к членам или измените структуру кода, чтобы избежать прямого использованияdefault(T). - Используйте
nullв качестве значения параметра по умолчанию для необязательных параметров, тип которого является ссылочным типом (CS1763). Если обобщённый метод имеет параметр типаT, аTявляется ссылочным типом, заменитеdefault(U)наnull, поскольку значения по умолчанию для необязательных параметров должны быть константами времени компиляции, иdefault(T)не устраняет это требование. - Явно укажите аргументы типа при передаче динамических значений универсальным локальным функциям (CS8322). При передаче аргумента
dynamicв универсальную локальную функцию компилятор не может выводить аргументы типа. Явно укажите аргумент типа или приведение динамического значения. - Убедитесь, что аргументы типа, используемые в общедоступных или защищённых сигнатурах, не менее доступны, чем член (CS9338). Общедоступный обобщённый элемент должен использовать аргументы типа, доступные всем. Либо сделать аргумент типа общедоступным, либо уменьшить доступность элемента.
Дополнительные сведения см. в разделе "Ограничения для параметров типа " и выражений значений по умолчанию.
UnmanagedCallersOnly Ограничения
- CS8893: 'type' не является допустимым типом соглашения вызова для 'UnmanagedCallersOnly'.
- CS8894: Не удается использовать "type" в качестве параметра или возвращаемого типа в методе, помеченном атрибутом "UnmanagedCallersOnly".
- CS8895: Методы, помеченные атрибутом 'UnmanagedCallersOnly', не могут иметь параметры типа и не могут быть объявлены в обобщённом типе.
- CS8896: UnmanagedCallersOnly может применяться только к обычным статическим не абстрактным, не-виртуальным методам или статическим локальным функциям.
Атрибут UnmanagedCallersOnlyAttribute помечает методы, которые неуправляемый код может вызывать. Эти методы имеют строгие требования, так как среда выполнения должна обрабатывать переход между соглашениями об управляемых и неуправляемых вызовах.
- Используйте только допустимые типы соглашений о вызовах в атрибуте
UnmanagedCallersOnly(CS8893). СвойствоCallConvsатрибута принимает только распознанные типы соглашений о вызовах изSystem.Runtime.CompilerServicesпространства имен. - Используйте только в качестве параметров и возвращаемых типов (CS8894). Методы, помеченные как
UnmanagedCallersOnly, не могут использовать управляемые типы (например,stringилиobject) в качестве типов параметров или возвращаемых значений, поскольку неуправляемые вызывающие объекты не могут управлять ссылками, управляемыми сборщиком мусора. - Удалите параметры универсального типа из
UnmanagedCallersOnlyметодов и не объявляйте их в универсальных типах (CS8895). Неуправляемые соглашения о вызовах не поддерживают универсальные шаблоны, так как среда выполнения не может определить правильное соглашение о вызовах для подстановок универсальных типов. - Применяется
UnmanagedCallersOnlyтолько к обычным статическим, не абстрактным, не-виртуальным методам или статическим локальным функциям (CS8896). Методы экземпляра, абстрактные методы и виртуальные методы нельзя помечать атрибутомUnmanagedCallersOnly, так как неуправляемый вызывающий код не может выполнять механизмы диспетчеризации, которые требуются этим методам.
Дополнительные сведения см. в разделе UnmanagedCallersOnlyAttribute.