Beheben von Fehlern und Warnungen im Zusammenhang mit generischen Typparametern und generischen Typargumenten

In diesem Artikel werden die folgenden Compilerfehler behandelt:

  • CS0080: Einschränkungen sind für nicht generische Deklarationen nicht zulässig.
  • CS0081: Typparameterdeklaration muss ein Bezeichner sein, kein Typ.
  • CS0224: Eine Methode mit vararg kann nicht generisch sein, nicht in einem generischen Typ vorhanden sein oder einen Paramsparameter aufweisen.
  • CS0304: Es kann keine Instanz des Variablentyps erstellt werden, da sie nicht über die new() Einschränkung verfügt.
  • CS0305: Die Verwendung des generischen Typs erfordert N-Typargumente.
  • CS0306: Der Typ wird möglicherweise nicht als Typargument verwendet.
  • CS0307: Der "Bezeichner" kann nicht mit Typargumenten verwendet werden.
  • CS0308: Die nicht generische Typ-oder-Methode kann nicht mit Typargumenten verwendet werden.
  • CS0310: Der Typ muss ein nicht abstrakter Typ mit einem öffentlichen parameterlosen Konstruktor sein, um ihn als Parameter im generischen Typ oder der generischen Methode zu verwenden.
  • CS0311: Der Typ kann nicht als Typparameter T im generischen Typ oder in der generischen Methode verwendet werden. Es gibt keine implizite Verweiskonvertierung von "type1" in "type2".
  • CS0312: Der Typ 'type1' kann nicht als Typparameter im generischen Typ oder der generischen Methode verwendet werden. Der nullwerte Typ 'type1' erfüllt nicht die Einschränkung von 'constraint'.
  • CS0313: Der Typ "type1" kann nicht als Typparameter im generischen Typ oder der generischen Methode verwendet werden. Der nullwerte Typ 'type1' erfüllt nicht die Einschränkung von 'constraint'. Nullable-Typen können keine Schnittstelleneinschränkungen erfüllen.
  • CS0314: Der Typ kann nicht als Typparameter im generischen Typ oder in der generischen Methode verwendet werden. Es gibt keine Boxkonvertierung oder Typparameterkonvertierung von 'type' zu 'constraint'.
  • CS0315: Der Typ kann nicht als Typparameter T im generischen Typ oder der generischen Methode verwendet werden. Es gibt keine Boxkonvertierung von "Typ" in "Einschränkung".
  • CS0401: Die new() Einschränkung muss die letzte restriktiv angegebene Einschränkung sein.
  • CS0403: Null kann nicht in Typparameter konvertiert werden, da es sich um einen nicht nullablen Werttyp sein könnte. Erwägen Sie stattdessen die Verwendung default(T) .
  • CS0405: Doppelte Einschränkung für typparameter.
  • CS0406: Die Klassentypeinschränkung "constraint" muss vor anderen Einschränkungen erfolgen.
  • CS0409: Für den Typparameter "type parameter" wurde bereits eine Einschränkungsklausel angegeben. Alle Einschränkungen für einen Typparameter müssen in einer einzelnen Where-Klausel angegeben werden.
  • CS0411: Die Typargumente für die Methode "methode" können nicht von der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.
  • CS0412: Parameter: Ein Parameter, eine lokale Variable oder eine lokale Funktion kann nicht denselben Namen wie ein Methodentypparameter haben.
  • CS0413: Der Typparameter kann nicht mit dem as Operator verwendet werden, da er weder über eine Klassentypeinschränkung noch über eine Einschränkung verfügt class .
  • CS0417: Bezeichner: Beim Erstellen einer Instanz eines Variablentyps können keine Argumente bereitgestellt werden.
  • CS0449: Die Einschränkungen class, struct, unmanaged, notnull und default können nicht kombiniert oder dupliziert werden und müssen zuerst in der Einschränkungsliste angegeben werden.
  • CS0450: Typparameter: Ein Typparameter darf nicht sowohl eine Einschränkungsklasse als auch die class- oder struct-Einschränkung angeben.
  • CS0451: Die new() Einschränkung kann nicht mit der struct Einschränkung verwendet werden.
  • CS0452: Der Typ "Typname" muss ein Verweistyp sein, um ihn als Parameter "Parametername" im generischen Typ oder der Methode "generic" zu verwenden.
  • CS0453: Der Typ "Typname" muss ein nicht nullwertbarer Werttyp sein, um ihn als Parameter "Parametername" im generischen Typ oder der Methode "generic" zu verwenden.
  • CS0454: Zirkeleinschränkungsabhängigkeit mit Typparameter 1 und Typparameter 2.
  • CS0455: Der Typparameter erbt widersprüchliche Einschränkungen "constraint1" und "constraint2".
  • CS0456: Typparameter 'type parameter 1' weist die 'struct'-Einschränkung auf, sodass 'type parameter 1' nicht als Einschränkung für 'Typparameter 2' verwendet werden kann.
  • CS0693: Typparameter 'type parameter' hat denselben Namen wie der Typparameter vom äußeren Typ 'type'.
  • CS0694: Der Typparameter hat denselben Namen wie der enthaltende Typ oder die Methode.
  • CS0695: 'type' kann nicht sowohl 'interface1' als auch 'interface2' implementieren, da sie für einige Typenparameterersetzungen zusammenfallen könnten.
  • CS0698: Ein generischer Typ kann nicht vom Typ abgeleitet werden, da es sich um eine Attributklasse handelt.
  • CS0699: 'generic' definiert keinen Typparameter 'identifier'.
  • CS0701: "Identifier" ist keine gültige Einschränkung. Ein typ, der als Einschränkung verwendet wird, muss eine Schnittstelle, eine nicht versiegelte Klasse oder ein Typparameter sein.
  • CS0702: Einschränkung darf keine spezielle Klasse sein.
  • CS0703: Inkonsistente Barrierefreiheit: Einschränkungstyp ist weniger zugänglich als Deklaration.
  • CS0704: Die Suche nach nicht virtuellen Membern kann in "type" nicht durchgeführt werden, da es sich um einen Typparameter handelt.
  • CS0706: Ungültiger Einschränkungstyp. Ein typ, der als Einschränkung verwendet wird, muss eine Schnittstelle, eine nicht versiegelte Klasse oder ein Typparameter sein.
  • CS0717: Statische Klasse: Statische Klassen können nicht als Einschränkungen verwendet werden.
  • CS0718: 'type': Statische Typen können nicht als Typargumente verwendet werden.
  • CS1720: Der Ausdruck führt immer zu einer System.NullReferenceException, da der Standardwert eines „generischen Typs“ null ist.
  • CS1763: 'parameter' ist vom Typ 'type'. Ein Standardwert eines anderen Bezugstyps als Zeichenfolge kann nur mit NULL initialisiert werden.
  • CS1948: Die Bereichsvariable 'name' darf nicht denselben Namen wie ein Methodentypparameter aufweisen.
  • CS1960: Ungültiger Varianzmodifizierer. Nur Schnittstellen- und Delegattypparameter können als Variante angegeben werden.
  • CS1961: Ungültige Varianz: Der Typparameter muss für 'type' kovariant gültig sein. 'type parameter' ist kontravariant.
  • CS3024: Einschränkungstyp "Type" ist nicht CLS-kompatibel.
  • CS7002: Unerwartete Verwendung eines generischen Namens.
  • CS8322: Argument mit dynamischem Typ kann nicht an generische lokale Funktion mit abgeleiteten Typargumenten übergeben werden.
  • CS8375: Die Einschränkung "new()" kann nicht mit der Einschränkung "nicht verwaltet" verwendet werden.
  • CS8377: Der Typ "type" muss ein nicht-NULL-Werttyp sein, ebenso wie alle Felder auf jeder Schachtelungsebene, damit er als Parameter "parameter" im generischen Typ bzw. in der generischen Methode "generic" verwendet werden kann.
  • CS8379: Der Typparameter "Type Parameter 1" weist die Einschränkung "nicht verwaltet" auf, sodass "Typparameter 1" nicht als Einschränkung für "Typparameter 2" verwendet werden kann.
  • CS8380: 'type': Es können nicht sowohl eine Klassenbeschränkung als auch die „unmanaged“-Beschränkung angegeben werden.
  • CS8387: Typparameter 'type parameter' hat denselben Namen wie der Typparameter aus der äußeren Methode 'method'.
  • CS8389: Das Weglassen des Typarguments ist im aktuellen Kontext nicht zulässig.
  • CS8427: Enums, Klassen und Strukturen können nicht in einer Schnittstelle deklariert werden, die über einen "in"- oder "out"-Typparameter verfügt.
  • CS8665: Die Methode 'method' legt eine 'class'-Einschränkung für den Typparameter 'type parameter' fest, aber der entsprechende Typparameter 'type parameter' der überschriebenen oder explizit implementierten Methode 'method' ist kein Verweistyp.
  • CS8666: Die Methode 'method' gibt für den Typparameter 'type parameter' die 'struct'-Einschränkung vor, aber der entsprechende Typparameter 'type parameter' der überschriebenen oder explizit implementierten Methode 'method' ist kein nicht nullabler Werttyp.
  • CS8822: Die Methode 'method' gibt eine 'default'-Einschränkung für den Typparameter 'type parameter' an, aber der entsprechende Typparameter 'type parameter' der überschriebenen oder explizit implementierten Methode 'method' ist auf einen Verweistyp oder Werttyp eingeschränkt.
  • CS8823: Die 'default'-Einschränkung ist nur für override-Methoden und Methoden mit expliziter Schnittstellenimplementierung gültig.
  • CS8893: "type" ist kein gültiger Anrufkonventionstyp für "UnmanagedCallersOnly".
  • CS8894: 'type' kann nicht als Parameter oder Rückgabetyp für eine Methode verwendet werden, die mit 'UnmanagedCallersOnly' zugeschrieben ist.
  • CS8895: Methoden, die "UnmanagedCallersOnly" zugeordnet sind, können keine generischen Typparameter aufweisen und können nicht in einem generischen Typ deklariert werden.
  • CS8896: "UnmanagedCallersOnly" kann nur auf normale, nicht abstrakte, nicht virtuelle Methoden oder statische lokale Funktionen angewendet werden.
  • CS9011: Schlüsselwort delegate kann nicht als Einschränkung verwendet werden. Haben Sie gemeint System.Delegate?
  • CS9012: Unerwartetes Schlüsselwort record. Haben Sie gemeint record struct oder record class?
  • CS9338: Inkonsistente Barrierefreiheit: Der Typ ist weniger barrierefrei als die Klasse.

Typparameterdeklaration und Benennung

  • CS0080: Einschränkungen sind für nicht generische Deklarationen nicht zulässig.
  • CS0081: Typparameterdeklaration muss ein Bezeichner sein, kein Typ.
  • CS0412: Parameter: Ein Parameter, eine lokale Variable oder eine lokale Funktion kann nicht denselben Namen wie ein Methodentypparameter haben.
  • CS0693: Typparameter 'type parameter' hat denselben Namen wie der Typparameter vom äußeren Typ 'type'.
  • CS0694: Der Typparameter hat denselben Namen wie der enthaltende Typ oder die Methode.
  • CS0699: 'generic' definiert keinen Typparameter 'identifier'.
  • CS1948: Die Bereichsvariable 'name' darf nicht denselben Namen wie ein Methodentypparameter aufweisen.
  • CS8387: Typparameter 'type parameter' hat denselben Namen wie der Typparameter aus der äußeren Methode 'method'.
  • CS9012: Unerwartetes Schlüsselwort record. Haben Sie gemeint record struct oder record class?

Diese Fehler beziehen sich auf die Deklarieren und Benennen von Typparametern in generischen Typen und Methoden. Typparameternamen müssen gültige Bezeichner sein, dürfen nicht mit anderen Bezeichnern im Bereich in Konflikt stehen und müssen in der Typparameterliste der Deklaration angezeigt werden.

  • Entfernen Sie die Einschränkungsklausel aus nicht generischen Deklarationen (CS0080). Die where Klausel kann nur für generische Typen und Methoden verwendet werden, die Typparameter deklarieren. Wenn Sie Einschränkungen anwenden müssen, fügen Sie dem Typ oder der Methodendeklaration zuerst Typparameter hinzu.
  • Ersetzen Sie tatsächliche Typnamen durch Bezeichner in Typparameterdeklarationen (CS0081). Sie müssen Typparameter mithilfe von Bezeichnern (wie T, TKey oder TValue) anstelle von konkreten Typen (wie int oder string) deklarieren. Der Zweck eines Typparameters besteht darin, als Platzhalter zu dienen, den der Compiler durch tatsächliche Typen ersetzt, wenn der generische Typ oder die Methode verwendet wird.
  • Benennen Sie Typparameter, lokale Variablen, Parameter oder Bereichsvariablen um Namenskonflikte zu vermeiden (CS0412, CS0694, CS1948). Typparameternamen dürfen keine Bezeichner im selben Gültigkeitsbereich verdecken, und sie dürfen nicht mit dem Namen des umschließenden Typs oder der umschließenden Methode übereinstimmen. LINQ-Bereichsvariablen können auch den Typparameternamen einer Methode nicht wiederverwenden. Solche Konflikte erzeugen Mehrdeutigkeit darüber, auf welchen Bezeichner verwiesen wird.
  • Verwenden Sie einen anderen Namen für innere Typparameter, die äußere Schatten haben (CS0693, CS8387). Wenn sich ein generisches Element (z. B. eine Methode oder ein geschachtelter Typ) in einer generischen Klasse oder Methode befindet, entspricht der innere Typparameter nicht unbedingt dem äußeren Element. Die Angabe desselben Namens führt zu Verwirrung darüber, auf welchen Typparameter verwiesen wird. Verwenden Sie einen eindeutigen Namen für den inneren Typparameter.
  • Stellen Sie sicher, dass alle Typparameter in Einschränkungsklauseln in der Typparameterliste (CS0699) deklariert werden. Eine where Klausel kann nur auf Typparameter verweisen, die in der generischen Deklaration angezeigt werden. Wenn der Name in der where Klausel keinem deklarierten Typparameter entspricht, überprüfen Sie auf Tippfehler oder Rechtschreibfehler.
  • Verwenden Sie die richtige Datensatzdeklarationssyntax (CS9012). Beim Deklarieren eines Datensatztyps müssen Sie entweder record class oder record struct (oder nur record für einen Verweistyp) verwenden. Das record Schlüsselwort allein kann nicht an Positionen angezeigt werden, an denen der Compiler eine andere Deklarationssyntax erwartet.

Weitere Informationen finden Sie unter "Generic Type Parameters " und "Generics".

Deklaration von Einschränkungen und deren Anordnung

  • CS0401: Die new() Einschränkung muss die letzte restriktiv angegebene Einschränkung sein.
  • CS0406: Die Klassentypeinschränkung "constraint" muss vor anderen Einschränkungen erfolgen.
  • CS0409: Für den Typparameter "type parameter" wurde bereits eine Einschränkungsklausel angegeben. Alle Einschränkungen für einen Typparameter müssen in einer einzelnen Where-Klausel angegeben werden.
  • CS0449: Die classEinschränkungen , struct, , unmanagednotnullund default Einschränkungen können nicht kombiniert oder dupliziert werden und müssen zuerst in der Einschränkungsliste angegeben werden.
  • CS0450: Typparameter: Sowohl eine Einschränkungsklasse als auch die Einschränkung class oder struct kann nicht angegeben werden.
  • CS0451: Die new() Einschränkung kann nicht mit der struct Einschränkung verwendet werden.
  • CS8375: Die Einschränkung "new()" kann nicht mit der Einschränkung "nicht verwaltet" verwendet werden.
  • CS8380: 'type': Es kann nicht sowohl eine Einschränkungsklasse als auch die 'unmanaged'-Einschränkung angegeben werden.
  • CS9011: Schlüsselwort delegate kann nicht als Einschränkung verwendet werden. Haben Sie gemeint System.Delegate?

Einschränkungen für Typparameter müssen einer bestimmten Reihenfolge folgen: Primäre Einschränkungen (class, , struct, unmanaged, notnulloder default) kommen zuerst, dann eine Klassentypeinschränkung, gefolgt von Schnittstelleneinschränkungen und schließlich die new() Konstruktoreinschränkung. Einige Einschränkungen schließen sich gegenseitig aus und können nicht kombiniert werden. Alle Einschränkungen für einen einzelnen Typparameter müssen in einer einzelnen where Klausel angezeigt werden.

  • Platzieren Sie die new() Einschränkung am Ende der Einschränkungsliste (CS0401). Die new() Einschränkung muss nach allen anderen Einschränkungen angezeigt werden. Ändern Sie z. B. where T : new(), IDisposable in where T : IDisposable, new().
  • Platzieren Sie die Klassentypeinschränkung vor Schnittstelleneinschränkungen (CS0406). Wenn Sie einen Typparameter zusammen mit Schnittstellen auf eine bestimmte Basisklasse beschränken, muss die Klasse zuerst angezeigt werden. Ändern Sie z. B. where T : IDisposable, MyBaseClass in where T : MyBaseClass, IDisposable.
  • Kombinieren Sie alle Einschränkungen für einen Typparameter in einer einzelnen where Klausel (CS0409). Sie können nicht mehrere where Klauseln für denselben Typparameter verwenden. Zusammenführen in eine Klausel: Ändern where T : I where T : new() in where T : I, new(). Mehrere where Klauseln sind nur gültig, wenn sie auf unterschiedliche Typparameter abzielen.
  • Platzieren Sie primäre Einschränkungen zuerst, und kombinieren Sie keine sich gegenseitig ausschließenden Einschränkungen (CS0449). Sie können höchstens eines von class, struct, unmanaged, notnull oder default angeben, und dieses muss zuerst in der Einschränkungsliste stehen. Die class und struct Einschränkungen schließen sich gegenseitig aus, ebenso wie class und unmanaged.
  • Kombinieren Sie keine bestimmte Klasseneinschränkung mit class, structoder unmanaged (CS0450, CS8380). Wenn ein Typparameter auf einen bestimmten Klassentyp beschränkt ist, handelt es sich implizit um einen Verweistyp, der der struct Odereinschränkung unmanaged widerspricht. Entfernen Sie entweder die Klasseneinschränkung oder die primäre Einschränkung.
  • Kombinieren Sie nicht new() mit struct oder unmanaged (CS0451, CS8375). Alle Werttypen haben implizit einen öffentlichen parameterlosen Konstruktor, sodass die Einschränkung new() redundant ist, wenn sie mit struct kombiniert wird. Das gleiche gilt für unmanaged, was impliziert struct. Entfernen Sie die new() Einschränkung.
  • Ersetzen durch delegateSystem.Delegate in Einschränkungsklauseln (CS9011). Das delegate Schlüsselwort wird zum Deklarieren von Delegattypen und nicht als Einschränkung verwendet. Verwenden Sie System.Delegate den Einschränkungstyp, um einen Typparameter auf Stellvertretungstypen zu beschränken.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter (C#-Programmierhandbuch).

Gültige Einschränkungstypen

  • CS0405: Doppelte Einschränkung für typparameter.
  • CS0701: "Identifier" ist keine gültige Einschränkung. Ein typ, der als Einschränkung verwendet wird, muss eine Schnittstelle, eine nicht versiegelte Klasse oder ein Typparameter sein.
  • CS0702: Einschränkung darf keine spezielle Klasse sein.
  • CS0703: Inkonsistente Zugänglichkeit: Einschränkungsart ist weniger zugänglich als die Deklaration.
  • CS0706: Ungültiger Einschränkungstyp. Ein typ, der als Einschränkung verwendet wird, muss eine Schnittstelle, eine nicht versiegelte Klasse oder ein Typparameter sein.
  • CS0717: Statische Klasse: Statische Klassen können nicht als Einschränkungen verwendet werden.
  • CS3024: Einschränkungstyp "Type" ist nicht CLS-kompatibel.

Eine Einschränkung muss eine Schnittstelle, eine nicht versiegelte Klasse oder ein Typparameter sein. Bestimmte Typen sind als Einschränkungen ungültig, entweder aufgrund ihrer besonderen Bedeutung im .NET-Typsystem oder weil sie nicht vererbt werden können.

  • Entfernen doppelter Einschränkungen (CS0405). Jede Einschränkung kann nur einmal in einer Einschränkungsklausel angezeigt werden. Wenn Sie über das Duplikat verfügen where T : I, I, entfernen Sie das Duplikat.
  • Verwenden Sie nur nicht versiegelte Typen als Einschränkungen (CS0701). Versiegelte Klassen, Strukturen und Enumerationen können nicht geerbt werden, sodass sie keinen Zweck als Einschränkungen erfüllen. Verwenden Sie eine Schnittstelle, die die gewünschten Typen implementieren oder eine nicht versiegelte Basisklasse verwenden.
  • Verwenden Sie keine speziellen Klassen als Einschränkungen (CS0702). Die Typen Object, Arrayund ValueType können nicht als Einschränkungen verwendet werden. Jeder Typ leitet sich bereits von Object ab, daher bringt eine Einschränkung darauf keinen Mehrwert. Array und ValueType sind abstrakte Basistypen, die nicht direkt geerbt werden können. Wenn Sie ein arrayähnliches Verhalten benötigen, verwenden Sie stattdessen IList<T> oder IEnumerable<T>.
  • Stellen Sie sicher, dass Einschränkungstypen mindestens so barrierefrei sind wie der generische Typ (CS0703). Ein öffentlicher generischer Typ kann keine Einschränkungen mit internen Typen aufweisen, da externer Code keine gültigen Typargumente bereitstellen kann. Entweder den Constraint-Typ öffentlich machen oder die Zugänglichkeit des generischen Typs verringern.
  • Verwenden Sie nur Schnittstellen, nicht versiegelte Klassen oder Typparameter als Einschränkungen (CS0706). Sie können keine Arrays, versiegelten Klassen, Strukturen, Enumerationen oder andere ungültige Typen als Einschränkungen verwenden. Erwägen Sie die Verwendung einer Schnittstelle, die von den gewünschten Typen implementiert wird.
  • Verwenden Sie statische Klassen nicht als Einschränkungen (CS0717). Statische Klassen können nicht erweitert werden, da sie nur statische Member enthalten. Kein Typ kann von einer statischen Klasse abgeleitet werden, sodass er als Einschränkung nutzlos ist.
  • Verwenden Sie einen CLS-kompatiblen Typ für die Typeinschränkung (CS3024). Wenn eine Assembly mit [assembly: CLSCompliant(true)] gekennzeichnet ist, kann die Verwendung eines nicht CLS-kompatiblen Typs als generische Typparametereinschränkung dazu führen, dass in einigen Sprachen geschriebener Code Ihre generische Klasse nicht verwenden kann.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter (C#-Programmierhandbuch).

Erfüllung von Einschränkungen und Konvertierungen

  • CS0311: Der Typ kann nicht als Typparameter T im generischen Typ oder in der generischen Methode verwendet werden. Es gibt keine implizite Verweiskonvertierung von "type1" in "type2".
  • CS0312: Der Typ kann nicht als Typparameter im generischen Typ oder der generischen Methode verwendet werden. Der nullable Typ erfüllt nicht die Einschränkung von "constraint".
  • CS0313: Der Typ kann nicht als Typparameter im generischen Typ oder der generischen Methode verwendet werden. Der nullable Typ erfüllt nicht die Einschränkung von "constraint". Nullable-Typen können keine Schnittstelleneinschränkungen erfüllen.
  • CS0314: Der Typ kann nicht als Typparameter im generischen Typ oder in der generischen Methode verwendet werden. Es gibt keine Boxkonvertierung oder Typparameterkonvertierung von 'type' zu 'constraint'.
  • CS0315: Der Typ kann nicht als Typparameter T im generischen Typ oder der generischen Methode verwendet werden. Es gibt keine Boxkonvertierung von "Typ" in "Einschränkung".
  • CS0452: Der Typ "Typname" muss ein Verweistyp sein, um ihn als Parameter "Parametername" im generischen Typ oder der Methode "generic" zu verwenden.
  • CS0453: Der Typ "Typname" muss ein nicht nullwertbarer Werttyp sein, um ihn als Parameter "Parametername" im generischen Typ oder der Methode "generic" zu verwenden.
  • CS8377: Der Typ "type" muss ein nicht-nullbarer Werttyp sein, ebenso wie alle Felder auf jeder Verschachtelungsebene, damit er als Parameter "parameter" im generischen Typ bzw. in der generischen Methode "generic" verwendet werden kann.

Diese Fehler treten auf, wenn ein Typargument die für einen generischen Typparameter deklarierten Einschränkungen nicht erfüllt. Das Typargument muss über die richtigen Konvertierungen, Vererbungsbeziehungen und strukturellen Eigenschaften verfügen, um allen Einschränkungen zu entsprechen.

  • Ändern Sie das Typargument in ein Argument, das über eine implizite Verweiskonvertierung in den Einschränkungstyp (CS0311) verfügt. Wenn ein Typparameter eine Einschränkung wie where T : BaseType hat, muss BaseType jedes Typargument durch eine implizite Verweiskonvertierung oder Identitätskonvertierung konvertierbar sein. Implizite numerische Konvertierungen (z. B. von short zu int) erfüllen keine generischen Typparametereinschränkungen.
  • Verwenden Sie nicht nullable Werttypen, oder ändern Sie den Einschränkungstyp (CS0312, CS0313). Nullable-Werttypen (wie int?) unterscheiden sich von ihren zugrunde liegenden Werttypen und erfüllen nicht dieselben Einschränkungen. Nullable-Werttypen können keine Schnittstellenbeschränkungen erfüllen, da der Nullable-Wrapper selbst die Schnittstelle nicht implementiert. Verwenden Sie die nicht nullwerte Form des Werttyps als Typargument.
  • Wiederholen Sie die Typparametereinschränkungen der Basisklasse in einer abgeleiteten Klassendeklaration (CS0314). Wenn eine abgeleitete generische Klasse von einer eingeschränkten generischen Basisklasse erbt, muss die abgeleitete Klasse dieselben Einschränkungen für die entsprechenden Typparameter deklarieren.
  • Stellen Sie sicher, dass Typargumente Bezugstypen oder Klasseneinschränkungen erfüllen (CS0315). Wenn ein Typparameter auf einen Klassentyp beschränkt ist, können Sie keinen Werttyp (Struktur) als Typargument verwenden, da keine Boxkonvertierung vorhanden ist, die die Einschränkungsbeziehung erfüllt. Verwenden Sie einen Verweistyp, der von der Einschränkung erbt oder implementiert.
  • Verwenden Sie einen Verweistyp als Typargument, wenn die class Einschränkung angegeben wird (CS0452). Werttypen wie struct oder int können eine class-Einschränkung nicht erfüllen. Ändern Sie entweder das Typargument in einen Verweistyp, oder entfernen Sie die class Einschränkung, wenn der generische Typ mit Werttypen arbeiten kann.
  • Verwenden Sie einen nicht nullablen Werttyp als Typargument, wenn die struct Einschränkung angegeben wird (CS0453). Verweistypen, Nullwertetypen (int?) und andere Nichtwerttypen können keine struct Einschränkung erfüllen. Verwenden Sie einen konkreten Werttyp, der keine NULL-Werte zulässt, wie z. B. int, double oder einen benutzerdefinierten struct.
  • Verwenden Sie einen Typ, dessen Felder alle nicht verwalteten Typen sind, wenn die unmanaged Einschränkung angegeben wird (CS8377). Die unmanaged Einschränkung erfordert einen nicht nullfähigen Werttyp, bei dem jedes Feld auf jeder Schachtelungsebene auch ein nicht verwalteter Typ ist. Typen, die Referenztypfelder oder generische Typparameter enthalten, die nicht als nicht verwaltet bekannt sind, erfüllen diese Einschränkung nicht.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter (C#-Programmierhandbuch).

Einschränkungskonflikte und Zirkelabhängigkeiten

  • CS0454: Zirkeleinschränkungsabhängigkeit mit Typparameter 1 und Typparameter 2.
  • CS0455: Der Typparameter erbt widersprüchliche Einschränkungen "constraint1" und "constraint2".
  • CS0456: Typparameter 'type parameter 1' weist die 'struct'-Einschränkung auf, sodass 'type parameter 1' nicht als Einschränkung für 'Typparameter 2' verwendet werden kann.
  • CS8379: Der Typparameter "Type Parameter 1" weist die Einschränkung "nicht verwaltet" auf, sodass "Typparameter 1" nicht als Einschränkung für "Typparameter 2" verwendet werden kann.

Einschränkungen können keine Zirkelabhängigkeiten erstellen, und Typparameter können keine widersprüchlichen Einschränkungen erben, die nicht gleichzeitig erfüllt werden können. Werttypeinschränkungen (struct und unmanaged) werden implizit versiegelt, sodass sie nicht als Einschränkungen für andere Typparameter verwendet werden können.

  • Zirkuläre Abhängigkeitsbeschränkungen entfernen (CS0454). Ein Typparameter kann nicht direkt oder indirekt durch seine Einschränkungen von sich selbst abhängig sein. Zum Beispiel erzeugt where T : U where U : T eine Zirkelabhängigkeit. Unterbrechen Sie den Zyklus, indem Sie eine der Einschränkungen entfernen.
  • Entfernen Sie konflikterende geerbte Einschränkungen (CS0455). Ein Typparameter kann nicht auf mehrere nicht verknüpfte Klassen beschränkt werden, da C# nicht die Vererbung mehrerer Klassen unterstützt. Ebenso kann es nicht sowohl durch struct als auch durch einen Klassentyp eingeschränkt werden. Strukturieren Sie Die Typhierarchie neu, oder entfernen Sie eine der widersprüchlichen Einschränkungen.
  • Verwenden Sie einen struct-eingeschränkten oder unmanaged-eingeschränkten Typparameter nicht als Einschränkung für einen anderen Typparameter (CS0456, CS8379). Werttypeinschränkungen sind implizit versiegelt, sodass kein anderer Typ von ihnen abgeleitet werden kann. Um diesen Fehler zu beheben, setzen Sie die Werttyp- oder nicht verwaltete Einschränkung direkt auf den zweiten Typparameter, anstatt ihn indirekt über den ersten Typparameter einzuschränken.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter (C#-Programmierhandbuch).

Regeln für Überschreibung und Implementierungseinschränkungen

  • CS8665: Die Methode 'method' gibt eine 'class'-Einschränkung für den Typparameter 'type parameter' an, aber der entsprechende Typparameter 'type parameter' der überschriebenen oder explizit implementierten Methode 'method' ist kein Verweistyp.
  • CS8666: Die Methode 'method' gibt für den Typparameter 'type parameter' eine 'struct'-Einschränkung an, aber der entsprechende Typparameter 'type parameter' der überschriebenen oder explizit implementierten Methode 'method' ist kein Werttyp, der NULL nicht zulässt.
  • CS8822: Die Methode 'method' gibt die 'default'-Einschränkung für den Typparameter 'type parameter' an, aber der entsprechende Typparameter 'type parameter' der überschriebenen oder explizit implementierten Methode 'method' ist auf einen Referenztyp oder Werttyp eingeschränkt.
  • CS8823: Der `default`-Constraint ist nur bei Überschreibungsmethoden und Methoden mit expliziter Schnittstellenimplementierung gültig.

Wenn Sie eine virtuelle Methode überschreiben oder explizit eine Schnittstellenmethode implementieren, müssen die Einschränkungen für die Typparameter der Überschreibungsmethode mit den Einschränkungen der Basismethode kompatibel sein. Die default Einschränkung ist ein spezieller Modifizierer, der nur in Außerkraftsetzungs- und expliziten Schnittstellenimplementierungsszenarien verwendet wird, um anzugeben, dass ein Typparameter weder über eine class noch struct eine Einschränkung verfügt.

  • Stellen Sie sicher, dass die Einschränkungen der Außerkraftsetzungsmethode den Einschränkungen der Basismethode (CS8665, CS8666) entsprechen. Eine Überschreibung kann keine class-Einschränkung hinzufügen, wenn der entsprechende Typparameter der Basismethode nicht auf einen Verweistyp eingeschränkt ist. Ebenso kann keine Einschränkung struct hinzugefügt werden, wenn der Typparameter der Basismethode nicht auf einen Werttyp beschränkt ist. Die Außerkraftsetzung muss mit der Basisdeklaration kompatibel sein.
  • Verwenden Sie die Einschränkung nur, wenn der Typparameter der default Basismethode nicht eingeschränkt ist (CS8822). Die default-Einschränkung gibt an, dass der Typparameter weder eine class- noch eine struct-Einschränkung aufweist. Sie können default nicht anwenden, wenn der entsprechende Typparameter der überschriebenen Methode bereits eine class- oder struct-Einschränkung aufweist.
  • Verwenden Sie die default-Constraint nur bei Überschreibungsmethoden oder Methoden mit expliziter Schnittstellenimplementierung (CS8823). Die default Einschränkung ist für reguläre Methodendeklarationen nicht gültig. Es dient speziell dazu, beim Überschreiben einer Methode, deren Basismethode einen uneingeschränkten Typparameter hatte, klarzustellen, dass auch die Überschreibung diesen uneingeschränkt lässt.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter und die default Einschränkung.

Konstruktoreinschränkungen

  • CS0304: Es kann keine Instanz des Variablentyps erstellt werden, da sie nicht über die new() Einschränkung verfügt.
  • CS0310: Der Typ muss ein nicht abstrakter Typ mit einem öffentlichen parameterlosen Konstruktor sein, um ihn als Parameter im generischen Typ oder der generischen Methode zu verwenden.
  • CS0417: Bezeichner: Beim Erstellen einer Instanz eines Variablentyps können keine Argumente bereitgestellt werden.

Diese Fehler beziehen sich auf die new() Einschränkungs- und Instanziierungstypparameter mit dem new Operator.

  • Fügen Sie die new() Einschränkung zu Typparametern hinzu, die Sie instanziieren müssen (CS0304). Wenn Sie innerhalb eines generischen Typs oder einer generischen Methode verwenden new T() , muss der Compiler garantieren, dass jedes Typargument über einen parameterlosen Konstruktor verfügt. Die new() Einschränkung bietet diese Garantie.
  • Stellen Sie sicher, dass Typargumente öffentliche parameterlose Konstruktoren haben (CS0310). Wenn ein Typparameter über die new() Einschränkung verfügt, muss jeder konkrete Typ, der als Typargument verwendet wird, nicht abstrakt sein und einen öffentlichen parameterlosen Konstruktor bereitstellen. Typen mit nur privaten, geschützten oder parametrisierten Konstruktoren können die new() Einschränkung nicht erfüllen.
  • Entfernen Von Konstruktorargumenten beim Instanziieren von Typparametern (CS0417). Die new() Einschränkung garantiert nur einen parameterlosen Konstruktor. Sie können new T(arguments) keine Argumente übergeben. Wenn Sie Instanzen mit bestimmten Argumenten erstellen müssen, sollten Sie ein Factorymuster oder eine Schnittstelleneinschränkung verwenden, die das Konstruktionsverhalten definiert.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter und die new() Einschränkung.

Typargumentanzahl und -verwendung

  • CS0224: Eine Methode mit vararg kann nicht generisch sein, nicht in einem generischen Typ vorhanden sein oder einen Paramsparameter aufweisen.
  • CS0305: Die Verwendung des generischen Typs erfordert N-Typargumente.
  • CS0306: Der Typ wird möglicherweise nicht als Typargument verwendet.
  • CS0307: Der "Bezeichner" kann nicht mit Typargumenten verwendet werden.
  • CS0308: Die nicht generische Typ-oder-Methode kann nicht mit Typargumenten verwendet werden.
  • CS7002: Unerwartete Verwendung eines generischen Namens.
  • CS8389: Das Weglassen des Typarguments ist im aktuellen Kontext nicht zulässig.

Diese Fehler beziehen sich auf die Angabe der richtigen Anzahl und Art von Argumenten für generische Typen und Methoden.

  • Entfernen Sie generische Typparameter oder enthaltende generische Typdeklarationen aus den Methoden, die __arglist verwenden (CS0224). Das __arglist Schlüsselwort ist nicht mit Generischen kompatibel, da die Laufzeitmechanismen für die Behandlung von Variablenargumentlisten mit der Typersetzung in Konflikt stehen, die für generische Typparameter erforderlich ist.
  • Geben Sie die genaue Anzahl von Typargumenten an, die in der generischen Deklaration (CS0305) angegeben sind. Jeder generische Typparameter in der Definition muss ein entsprechendes Typargument aufweisen, wenn der generische Typ instanziiert wird.
  • Verwenden Sie nur gültige Typen als Typargumente (CS0306). Zeigertypen (wie int* oder char*) können nicht als Typargumente verwendet werden, da generische Typen verwaltete Typen erfordern, die vom Garbage Collector nachverfolgt werden können.
  • Entfernen sie die Typargumentsyntax aus nicht generischen Konstrukten (CS0307, CS0308). Typargumente, die in eckige Klammern eingeschlossen sind, können nur auf generische Typen und Methoden angewendet werden, die Typparameter deklarieren. Stellen Sie sicher, dass Sie den Namespace importiert haben, der die generische Version des Typs enthält.
  • Entfernen Sie Typparameter aus Deklarationen, die keine Generics (CS7002) unterstützen. Einige Konstrukte, z. B. Enumerationen, können nicht generisch sein. Wenn Sie einen generischen Container für Enumerationswerte benötigen, sollten Sie stattdessen eine generische Klasse oder Struktur verwenden.
  • Geben Sie alle erforderlichen Typargumente explizit an (CS8389). In einigen Kontexten, z. B. die Verwendung des typeof Operators oder das Erstellen von Stellvertretungen, müssen Sie alle Typargumente angeben und können sie nicht weglassen. Verwenden Sie typeof(List<int>) z. B. anstelle des Weglassens des Typarguments.

Weitere Informationen finden Sie unter "Generic Type Parameters " und "Generics".

Typargument-Ableitung

  • CS0411: Die Typargumente für die Methode "methode" können nicht von der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Dieser Fehler tritt auf, wenn Sie eine generische Methode aufrufen, ohne explizit die Typargumente bereitzustellen, und der Compiler kann nicht ableiten, welche Typargumente Sie beabsichtigen. Der Compiler leitet Typargumente aus den Typen der Methodenargumente ab, die Sie an der Aufrufstelle übergeben.

  • Geben Sie die Typargumente explizit in spitzen Klammern (CS0411) an. Wenn der Compiler die Typargumente aus den Methodenargumenten nicht ermitteln kann, stellen Sie sie direkt bereit. Ändern Sie z. B. G() in G<int>(). Dieser Fehler tritt häufig auf, wenn eine generische Methode keine Parameter enthält, von denen der Typ abgeleitet werden soll, oder wenn ein null Argument übergeben wird und der Compiler den beabsichtigten Typ nicht ermitteln kann.

Weitere Informationen finden Sie unter generische Methoden.

Typparameterabweichung

  • CS1960: Ungültiger Varianzmodifizierer. Nur Schnittstellen- und Delegattypparameter können als Variante angegeben werden.
  • CS1961: Ungültige Varianz: Der Typparameter muss für 'type' kovariant gültig sein. 'type parameter' ist kontravariant.
  • CS8427: Enums, Klassen und Strukturen können nicht in einer Schnittstelle deklariert werden, die über einen "in"- oder "out"-Typparameter verfügt.

Varianzmodifizierer (in für Kontravarianz, out für Kovarianz) steuern, wie Sie Typparameter in Schnittstellen- und Delegatdeklarationen verwenden können. Nur Schnittstellen und Stellvertretungen unterstützen die Varianz. Ein kovarianter (out) Typparameter kann nur in Ausgabepositionen (Rückgabetypen) angezeigt werden, während ein Kontravariant -inTypparameter () nur in Eingabepositionen (Parametertypen) angezeigt werden kann.

  • Verwenden Sie Varianzmodifizierer nur für Schnittstellen- und Delegattypparameter (CS1960). Klassen, Strukturen und andere Typdeklarationen unterstützen keine Varianzmodifizierer. Nur interface- und delegate-Deklarationen können bei ihren Typparametern in oder out verwenden.
  • Verwenden Sie out (kovariant) für Typparameter, die nur in Rückgabetypen angezeigt werden, und in (kontravariant) für Typparameter, die nur in Parametertypen (CS1961) angezeigt werden. Wenn der Typparameter an Eingabe- und Ausgabepositionen angezeigt werden muss, entfernen Sie den Varianzmodifizierer.
  • Deklarieren Sie keine Enumerationen, Klassen oder Strukturen innerhalb einer Variantenschnittstelle (CS8427). Geschachtelte Typdeklarationen innerhalb einer Schnittstelle mit in Parametern oder out Typparametern sind nicht zulässig, da sie gegen die Abweichungssicherheitsregeln verstoßen könnten. Verschieben Sie den geschachtelten Typ außerhalb der Schnittstellendeklaration.

Weitere Informationen finden Sie unter Kovarianz und Kontravarianz in Generics.

Allgemeine Typverwendungseinschränkungen

  • CS0403: Null kann nicht in Typparameter konvertiert werden, da es sich um einen nicht nullablen Werttyp sein könnte. Erwägen Sie stattdessen die Verwendung default(T) .
  • CS0413: Der Typparameter kann nicht mit dem as Operator verwendet werden, da er weder über eine Klassentypeinschränkung noch über eine Einschränkung verfügt class .
  • CS0695: "type" kann sowohl 'interface1' als auch 'interface2' nicht implementieren, da sie für einige Typenparameterersetzungen vereinheitlichen können.
  • CS0698: Ein generischer Typ kann nicht vom Typ abgeleitet werden, da es sich um eine Attributklasse handelt.
  • CS0704: Die Suche nach nicht virtuellen Membern kann in "type" nicht durchgeführt werden, da es sich um einen Typparameter handelt.
  • CS0718: 'type': Statische Typen können nicht als Typargumente verwendet werden.
  • CS1720: Der Ausdruck verursacht immer eine System.NullReferenceException, da der Standardwert eines generischen Typs null ist.
  • CS1763: 'parameter' ist vom Typ 'type'. Ein Standardwert eines anderen Bezugstyps als Zeichenfolge kann nur mit NULL initialisiert werden.
  • CS8322: Argument mit dynamischem Typ kann nicht an generische lokale Funktion mit abgeleiteten Typargumenten übergeben werden.
  • CS9338: Inkonsistente Barrierefreiheit: Der Typ ist weniger barrierefrei als die Klasse.

Diese Fehler beziehen sich auf Einschränkungen bei der Verwendung generischer Typen und Typparameter in Ausdrücken, bei der Vererbung und beim Memberzugriff.

  • Ersetzen Sie null Zuordnungen durch default(T) oder fügen Sie eine class Einschränkung (CS0403) hinzu. Wenn Sie einem nicht eingeschränkten Typparameter zuweisen null , kann der Compiler nicht garantieren, dass das Typargument ein Verweistyp ist. Verwenden Sie diese Eigenschaft default(T), die den geeigneten Standardwert für einen beliebigen Typ bereitstellt, oder fügen Sie eine class Einschränkung hinzu, wenn Sie speziell eine Referenztypsemantik benötigen.
  • Fügen Sie bei Verwendung des class Operators (as) eine oder eine bestimmte Typeinschränkung hinzu. Der as Operator gibt zurück null , wenn die Konvertierung fehlschlägt, werttypen können jedoch nicht sein null. Fügen Sie eine class Einschränkung hinzu, um sicherzustellen, dass der Typparameter immer ein Verweistyp ist.
  • Vermeiden Sie die Implementierung derselben generischen Schnittstelle mehrmals mit Typparametern, die vereinheitlichen könnten (CS0695). Wenn eine Klasse eine generische Schnittstelle mehrmals mit unterschiedlichen Typparametern implementiert (z class G<T1, T2> : I<T1>, I<T2>. B. ), das Instanziieren mit demselben Typ für beide Parameter würde einen Konflikt verursachen. Implementieren Sie die Schnittstelle nur einmal, oder strukturieren Sie sie um, um die Vereinheitlichung zu verhindern.
  • Entfernen von generischen Typparametern aus Attributklassen (CS0698). Dieser Fehler wird in den aktuellen Versionen von C# nicht mehr erstellt, da generische Attribute jetzt unterstützt werden.
  • Verwenden Sie den konkreten Einschränkungstyp anstelle des Typparameters für den Zugriff auf geschachtelte Member (CS0704). Sie können nicht über einen Typparameter auf geschachtelte Typen oder nicht virtuelle Member zugreifen. Verwenden Sie statt T.InnerType direkt den bekannten Einschränkungstyp, wie BaseClass.InnerType.
  • Verwenden Sie statische Typen nicht als Typargumente (CS0718). Statische Typen können nicht instanziiert werden und können nicht als generische Argumente verwendet werden. Entfernen Sie den statischen Typ aus dem generischen Argument.
  • Vermeiden Sie es, Instanzmember für default(T) aufzurufen, wenn T auf einen Verweistyp (CS1720) eingeschränkt ist. Wenn für T eine class-Einschränkung gilt, ist default(T)null, sodass beim Aufrufen von Instanzmembern darauf immer ein NullReferenceException ausgelöst wird. Fügen Sie vor dem Aufrufen von Membern eine NULL-Prüfung hinzu, oder strukturieren Sie den Code neu, um die direkte Verwendung default(T) zu vermeiden.
  • Wird als Standardparameterwert für optionale Parameter verwendet null , deren Typ ein Verweistyp ist (CS1763). Wenn eine generische Methode einen Parameter vom Typ T hat und T ein Referenztyp ist, ersetzen Sie default(U) durch null, da Standardwerte optionaler Parameter Kompilierzeitkonstanten sein müssen und default(T) diese Anforderung nicht aufhebt.
  • Geben Sie explizit Typargumente an, wenn dynamische Werte an generische lokale Funktionen (CS8322) übergeben werden. Wenn Sie ein dynamic Argument an eine generische lokale Funktion übergeben, kann der Compiler keine Typargumente ableiten. Geben Sie explizit das Typargument an, oder wandeln Sie den dynamischen Wert um.
  • Stellen Sie sicher, dass Typenargumente, die in öffentlichen oder geschützten Signaturen verwendet werden, mindestens so barrierefrei sind wie das Element (CS9338). Ein öffentliches generisches Element muss Typargumente verwenden, die öffentlich zugänglich sind. Machen Sie entweder das Typargument öffentlich, oder verringern Sie die Sichtbarkeit des Elements.

Weitere Informationen finden Sie unter Einschränkungen für Typparameter und Standardwertausdrücke.

UnmanagedCallersOnly Beschränkungen

  • CS8893: "type" ist kein gültiger Anrufkonventionstyp für "UnmanagedCallersOnly".
  • CS8894: 'type' kann nicht als Parameter oder Rückgabetyp für eine Methode verwendet werden, die mit 'UnmanagedCallersOnly' zugeschrieben ist.
  • CS8895: Methoden, die "UnmanagedCallersOnly" zugeordnet sind, können keine generischen Typparameter aufweisen und können nicht in einem generischen Typ deklariert werden.
  • CS8896: "UnmanagedCallersOnly" kann nur auf normale, nicht abstrakte, nicht virtuelle Methoden oder statische lokale Funktionen angewendet werden.

Das UnmanagedCallersOnlyAttribute Attribut kennzeichnet Methoden, die nicht verwalteten Code aufrufen können. Diese Methoden haben strenge Anforderungen, da die Laufzeit den Übergang zwischen verwalteten und nicht verwalteten Aufrufkonventionen verarbeiten muss.

  • Verwenden Sie nur gültige Aufrufkonventionstypen im UnmanagedCallersOnly Attribut (CS8893). Die CallConvs Eigenschaft des Attributs akzeptiert nur erkannte Aufrufkonventionstypen aus dem System.Runtime.CompilerServices Namespace.
  • Verwenden Sie nur blittbare Typen als Parameter und Rückgabetypen (CS8894). Methoden, die mit UnmanagedCallersOnly gekennzeichnet sind, können keine verwalteten Typen (wie string oder object) als Parameter- oder Rückgabetypen verwenden, da nicht verwaltete Aufrufer die durch die Garbage Collection verwalteten Verweise nicht verwalten können.
  • Entfernen Sie generische Typparameter aus UnmanagedCallersOnly Methoden, und deklarieren Sie sie nicht in generischen Typen (CS8895). Nicht verwaltete Aufrufkonventionen unterstützen keine Generischen, da die Laufzeit die richtige Aufrufkonvention für generische Typenersetzungen nicht bestimmen kann.
  • Gilt UnmanagedCallersOnly nur für gewöhnliche statische, nicht abstrakte, nicht virtuelle Methoden oder statische lokale Funktionen (CS8896). Instanzmethoden, abstrakte Methoden und virtuelle Methoden können nicht mit markiert UnmanagedCallersOnly werden, da nicht verwaltete Aufrufer die Verteilermechanismen, die diese Methoden erfordern, nicht ausführen können.

Weitere Informationen finden Sie unter UnmanagedCallersOnlyAttribute.