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

黄舟
黄舟Original
2017-03-07 10:59:151609Durchsuche

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

sind

ValSamplebd43222e33876353aff11e13a7dc75f6

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, ist

struct Sample8742468051c85b06f0a0af9e3e506b5c where T:IDisposable

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

Gültig: Sampleee3398fcc71686d89f0818db05b7a88f Referenzkonvertierung

Ungültig: Sample66631937a557270cbf0605de1ac49062

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 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 Referenztyp

typeof(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: Sample8ef407ed57caac12483dcecdcac4eb46

Ungültig: Sample6f72722a2a297c03396b6f57d1a9f381

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 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:IDisposable

Syntax Fehler

Da es diese Version auch online gibt

Gü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)!

Stellungnahme:
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