Heim > Backend-Entwicklung > C#.Net-Tutorial > Detaillierte grafische und textliche Einführung in generische C#-Einschränkungen

Detaillierte grafische und textliche Einführung in generische C#-Einschränkungen

黄舟
Freigeben: 2017-03-07 10:59:15
Original
1759 Leute haben es durchsucht

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 RefSample< T> 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 RefSample definiert ist, muss der eingehende Wert ein Referenztyp sein, aber RefSample ist immer noch ein Werttyp

2 Werttypbeschränkungen

class ValSample wobei T:struct

ein Referenztyp ist, da int, char und andere Typen alle struct

sind

ValSample

3. Konstruktortypbeschränkung

public T CreateInstance<T>() where T:new()
{
  return new T();
}
Nach dem Login kopieren

Der angegebene Typ T muss einen Konstruktor haben, CreateInstance sind beide gültig. Aber CreateInstance 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 Sample wobei T:Stream

gilt: Sample, das selbst der Einschränkung

ist ungültig: Sample Da der String-Typ nicht durch Verweis oder Ein- und Auspacken in einen Stream umgewandelt werden kann, ist

struct Sample where T:IDisposable

Es wird angegeben, dass T ein Referenztyp vom Typ IDisposable sein muss

Gültig: Sample Referenzkonvertierung

Ungültig: Sample

Analyse: 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 Sample wobei T:IComparable

Da IComparable als Einschränkung betrachtet wird, analysieren Sie IComparable< Der Typ von ;T> kann anhand von Type.IsValueType beurteilt werden, und false ist der Referenztyp

typeof(IComparable).IsValueType Ergebnis wird als Referenztyp als falsch dargestellt

Gültig: Sample (Boxing-Konvertierung)

Ungültig: Sample

Es können auch mehrere Einschränkungen angegeben werden :

Klassenbeispiel wobei T: stream, IEnumerable,IComparable

Klasse Sample wobei T:U

Gültig: Sample

Ungültig: Sample

Zusammenfassung: 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 Sample wobei T: class, IDisposable, new( )
class Sample where T: Stream where U:IDispsable

Ungültig:

class Sample where T: class, struct (ohne jegliche Typ-Direktreferenz) Der Typ ist ein Werttyp, daher ist er ungültig)

class Sample 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 Sample (new() muss am Ende platziert werden)

class Sample 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 Sample wobei T:Stream ,U:IDisposable

Syntax Fehler

Da es diese Version auch online gibt

Gültig

Ich verstehe nicht:

Klasse Beispiel wobei T: struct,IDisapsable IDisapsable ein Werttyp ist?

class Sample 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)!

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage