Heim >Backend-Entwicklung >C#.Net-Tutorial >Detaillierte grafische und textliche Einführung in generische C#-Einschränkungen
In diesem Artikel werden die Einschränkungen von C#-Generika ausführlich vorgestellt: Einschränkungen des Referenztyps; Einschränkungen des Konstruktortyps; Es hat einen sehr guten Referenzwert, schauen wir es uns mit dem folgenden Editor an
1 Referenztypbeschränkungen
struct RefSampleb32f285eaba7a6752dff0bc229700674 wobei T:class Der Referenztyp verwendet Class, um Einschränkungen darzustellen, und andere Referenztypen sind spezifische Einschränkungen.
bedeutet, dass die Einschränkung eine Klasse (Referenztyp) sein muss und kein Werttyp (int, char, datatime, struct) sein kann. Sie kann eine Schnittstelle sein
Unterscheidung, das Array ist ein Referenztyp, da Sie beim Definieren eines Arrays ein Objekt mit new erstellen müssen.
Obwohl es als RefSample8742468051c85b06f0a0af9e3e506b5c definiert ist, muss der eingehende Wert ein Referenztyp sein, aber RefSample ist immer noch ein Werttyp
2 Werttypbeschränkungen
class ValSample8742468051c85b06f0a0af9e3e506b5c wobei T:struct
ein Referenztyp ist, da int, char und andere Typen alle struct
sindValSamplebd43222e33876353aff11e13a7dc75f6
3. Konstruktortypbeschränkung
public T CreateInstance<T>() where T:new() { return new T(); }
Der angegebene Typ T muss einen Konstruktor haben, CreateInstancebd43222e33876353aff11e13a7dc75f6 sind beide gültig. Aber CreateInstance8ac337f12ac35ec97e8dd89560472ecc hat keinen Konstruktor.
4. Einschränkungen für Konvertierungstypen
Eine Einschränkung ermöglicht die Angabe eines anderen Typs. Das Typargument muss implizit durch Konsistenz, Referenz oder Boxing-Konvertierung in diesen Typ konvertierbar sein . Sie können auch angeben, dass ein Typargument in ein anderes Typargument konvertierbar sein muss – dies wird als Typparametereinschränkung bezeichnet.
Verstandene Bedeutung: austauschbar, das heißt, jeder Typ, den wir durch Boxen oder erzwungenen Typ in den Zieltyp konvertieren können, kann zur Übergabe von Typparametern verwendet werden.
Klasse Sample8742468051c85b06f0a0af9e3e506b5c wobei T:Stream
gilt: Sample7deb1b66c2439bfe6895a394cbb2197a, das selbst der Einschränkung
ist ungültig: Samplef7e83be87db5cd2d9a8a0b8117b38cd4 Da der String-Typ nicht durch Verweis oder Ein- und Auspacken in einen Stream umgewandelt werden kann, iststruct Sample8742468051c85b06f0a0af9e3e506b5c where T:IDisposable
Es wird angegeben, dass T ein Referenztyp vom Typ IDisposable sein mussGültig: Sampleee3398fcc71686d89f0818db05b7a88f ReferenzkonvertierungUngültig: Sample66631937a557270cbf0605de1ac49062Analyse: Warum kann SqlConnection, aber nicht StringBuilder? Sie sind alle Referenztypen
1. SqlConnection implementiert die IDisposable-Schnittstelle, sodass sie kovariant sein kann
2. StringBuilder implementiert nur die ISerializable-Schnittstelle und kann nicht in IDisposable konvertiert werden
class Sample8742468051c85b06f0a0af9e3e506b5c wobei T:IComparable8742468051c85b06f0a0af9e3e506b5c
Da IComparable8742468051c85b06f0a0af9e3e506b5c als Einschränkung betrachtet wird, analysieren Sie IComparabled085f7182ba8c9824b3e013791b80f96 kann anhand von Type.IsValueType beurteilt werden, und false ist der Referenztyptypeof(IComparable8742468051c85b06f0a0af9e3e506b5c).IsValueType Ergebnis wird als Referenztyp als falsch dargestellt
Gültig: Samplebd43222e33876353aff11e13a7dc75f6 (Boxing-Konvertierung) Ungültig: Sampled0869186ef29f1614dd65eb5411320d5 Es können auch mehrere Einschränkungen angegeben werden :Klassenbeispiel8742468051c85b06f0a0af9e3e506b5c wobei T: stream, IEnumerable98c455a79ddfebb79781bff588e7b37e,IComparablebd43222e33876353aff11e13a7dc75f6
Klasse Samplea62d1d8805a91a8900e4e7c7c3ba59db wobei T:U
Gültig: Sample8ef407ed57caac12483dcecdcac4eb46Ungültig: Sample6f72722a2a297c03396b6f57d1a9f381Zusammenfassung: Es hängt davon ab, ob die eingehenden Klassenparameter konvertiert werden können und ob die angegebenen Parameter und die eingehenden Klassenparameter dieselbe Schnittstelle implementieren. Wenn ja, ist dies in Ordnung, andernfalls ist dies nicht möglich.
darf nicht Folgendes sein: System.Object, System.Enum, System.ValueType, System.Delegate, Struktur oder versiegelte Klasse (String)
5. Kombinationseinschränkungen
Es gibt mehrere Einschränkungen für Typparameter. Hinweis: Es kann nur ein Typ sein, und Werttypen und Referenztypen können nicht vorhanden sein Gleichzeitig ist es nicht erforderlich, dass ein Typ sowohl ein Referenztyp als auch ein Werttyp ist.Da jeder Werttyp eine konstruktorlose Funktion hat, kann es danach keine Konstruktoreinschränkungen mehr geben
Gültig:
class Sample8742468051c85b06f0a0af9e3e506b5c wobei T: class, IDisposable, new( )
class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T: Stream where U:IDispsable
Ungültig:
class Sample8742468051c85b06f0a0af9e3e506b5c where T: class, struct (ohne jegliche Typ-Direktreferenz) Der Typ ist ein Werttyp, daher ist er ungültig)
class Sample8742468051c85b06f0a0af9e3e506b5c wobei T: Stream, Klasse (Die Referenztyp-Einschränkung sollte die erste Einschränkung sein, die vorne platziert ist, also ist sie ungültig) Stream beschränkt die eingehenden Parameter nur auf Stream-spezifische Typen , während die Klasse auf Referenztypen beschränkt ist
class Sample8742468051c85b06f0a0af9e3e506b5c (new() muss am Ende platziert werden)
class Sample8742468051c85b06f0a0af9e3e506b5c wobei T: IDisposable, Stream (class muss vor der Schnittstelle platziert werden, damit es ist ungültig. Einschränkung, daher kann „T“ nicht als Einschränkung von „U“ verwendet werden, daher ist es ungültig
Klasse Samplec619abd6b5b072b4427165f6c9e6f6e4 wobei T:Stream ,U:IDisposableSyntax Fehler
Da es diese Version auch online gibtGültig
Ich verstehe nicht:Klasse Beispiel8742468051c85b06f0a0af9e3e506b5c wobei T: struct,IDisapsable IDisapsable ein Werttyp ist?
class Samplea62d1d8805a91a8900e4e7c7c3ba59db wobei T: Klasse wobei U:struct,T T ein Referenztyp ist. Warum U zusammen mit dem Werttyp einschränken?
Ich hoffe, Sie können mich korrigieren
Das Obige ist C#-Generika Der Inhalt der Einschränkungen wird ausführlich mit Bildern und Texten vorgestellt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!