Heim Backend-Entwicklung C#.Net-Tutorial Detaillierte Erklärung von Kontravarianz und Kovarianz in C#

Detaillierte Erklärung von Kontravarianz und Kovarianz in C#

Sep 02, 2017 pm 02:32 PM
.net 详解

Dieser Artikel stellt hauptsächlich die relevanten Informationen zur C#-Inversion und -Kovarianz im Detail vor, die einen gewissen Referenzwert haben.

Dieser Artikel verwendet weitere Delegierte und Lambda-Ausdrücke Schauen Sie sich hierzu bitte meine Artikel „Delegierte und anonyme Delegierte“ und „Anonyme Delegierte und Lambda-Ausdrücke“ an, um Ihnen beim Aufbau eines vollständigen Wissenssystems zu helfen.

Im Prozess von C# von seiner Geburt bis zu seiner Entwicklung und seinem Wachstum werden ständig neue Wissenspunkte eingeführt. Kontravarianz und Kovarianz sind keine Originalität von C# und werden später eingeführt. Kontravarianz und Kovarianz gibt es auch in Java. Ich werde in Zukunft auch einen Artikel über Java-Kontravarianz und Kovarianz schreiben.

Kontravarianz und Kovarianz klingen abstrakt und tiefgreifend, sind aber eigentlich sehr einfach. Schauen Sie sich den folgenden Code an:


class Person
 {

 }
 class Student : Person
 {

 }
 class Teacher: Person
 {

 }
 
 class Program
 {
  static void Main(string[] args)
  {
   List<Person> plist = new List<Person>();
   plist = new List<Student>();
   plist = new List<Teacher>();
}
}
Nach dem Login kopieren

Im obigen Code ist plist = new List(), plist = new List() Eine Zusammenstellung Fehler tritt auf. Obwohl „Person“ die übergeordnete Klasse von „Student/Teacher“ ist, ist der Typ „List“ nicht die übergeordnete Klasse des Typs „List“. Daher meldet die obige Zuweisungsanweisung einen Typkonvertierungsfehler.

Zuweisungsvorgänge wie die oben genannten waren vor C# 4.0 nicht zulässig. Der Grund dafür, warum sie nicht zulässig sind, ist die Typensicherheit. Schauen Sie sich den folgenden Beispielcode an:


List<Person> plist = new List<Student>();
plist.Add(new Person());
plist.Add(new Student());
plist.Add(new Teacher());
Nach dem Login kopieren

Das folgende Beispiel geht davon aus, dass List plist = new List() eine Zuweisung zulässt, obwohl der Typ von plist ist die List< ;Person>-Sammlung, verweist jedoch tatsächlich auf die List-Sammlung. plist.Add(new Person()), die eigentliche Additionsoperation ruft List.Add() auf. Der Typ „Person“ kann nicht sicher in „Student“ konvertiert werden, daher ist eine solche Sammlungsdefinition nicht sinnvoll und die obige Annahme trifft daher nicht zu.

Aber die Situation hat sich nach C# 4.0 geändert. Es ist nicht so, dass „unmögliche Dinge passiert sind“, sondern dass die Flexibilität der Anwendung neue Anpassungen vorgenommen hat. Ebenso ist das obige Programm in C# 4.0 immer noch nicht zulässig, es tritt jedoch eine Ausnahme auf. Ab C# 4.0 dürfen in generischen Delegaten und generischen Schnittstellen Sondersituationen auftreten (im Wesentlichen sind keine besonderen Änderungen aufgetreten, die später erläutert werden). Das folgende Beispiel:


delegate void Work<T>(T item);

class Person
{
  public string Name { get; set; }
}
class Student : Person
{
  public string Like { get; set; }
}
class Teacher : Person
{
  public string Teach { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
   Work<Person> worker = (p) => { Console.WriteLine(p.Name); }; ;
   Work<Student> student_worker = (s) => { Console.WriteLine(s.Like); };
   student_worker = worker; //此处编译错误
  }
}
Nach dem Login kopieren

Nach der bisherigen theoretischen Unterstützung ist der Fehler von student_worker = worker leicht zu verstehen. Der Zweck unseres Programms hier besteht jedoch darin, den Arbeiter als Work fungieren zu lassen. In Zukunft wird der Aufruf von student_worker(s) tatsächlich Waker(s) aufrufen. Um unsere Anforderungen zu erfüllen, muss das Programm zwei Aspekte der Verarbeitung ausführen:

1 Denn beim Aufruf von student_worker(s) werden tatsächlich Waker(s) ausgeführt, also der Typ der s-Variablen muss erfolgreich in den vom Worker benötigten Parametertyp konvertiert werden.

2. Sie müssen dem Compiler mitteilen, dass er Variablen vom Typ Work zuweisen darf.

Bedingung 1 Beim Aufruf von student_worker() fordert der Compiler an, dass der Parameter ein Objekt vom Typ „Student“ sein muss, das erfolgreich in ein Objekt vom Typ „Person“ konvertiert werden kann.

Bedingung 2 erfordert Anpassungen an der Woke-Delegiertendefinition. Die Anpassungen sind wie folgt:


delegate void WorkIn<in T>(T item);
Nach dem Login kopieren

Der Zweck der Änderung des Delegiertennamens in WorkIn ist Um Änderungen vor und nach der Delegation zu vermeiden, ist der entscheidende Punkt . Markieren Sie durch Hinzufügen des Schlüsselworts in den Typparameter T des generischen Delegaten und verwenden Sie ihn nur als Parameter der Delegatenmethode. An diesem Punkt kann das obige Programm erfolgreich kompiliert und ausgeführt werden.


delegate void WorkIn<in T>(T item);
class Program
 {
  static void Main(string[] args)
  {
   WorkIn woker = (p) => { Console.WriteLine(p.Name); };
   WorkIn student_worker = woker;
   student_worker(new Student() { Name="tom", Like="C#" });

  }
 }
Nach dem Login kopieren

Die Situation, in der Typparameter Subtypen sein müssen und Zuweisungstypparameter übergeordnete Typwerte sein können, wird als Kontravarianz bezeichnet. Kontravarianz erfordert, dass die Typparameter von Generika in C# markiert werden. Obwohl Kontravarianz als Kontravarianz bezeichnet wird, sieht es nur formal so aus, als ob das übergeordnete Klassenobjekt der Unterklassenvariablen zugewiesen wird. Im Wesentlichen handelt es sich um die Typkonvertierung der Parameter beim Aufruf der Methode. Student s = new Person(), das ist unmöglich, das ist keine Kontravariante, es ist ein Fehler.

Wenn Sie den obigen Code in die folgende Form umwandeln können, können Sie die Inversion vergessen. Das Wesentliche ist wichtiger als das Phänomen.

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Kontravarianz und Kovarianz in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Detaillierte Erläuterung der Modusfunktion in C++ Detaillierte Erläuterung der Modusfunktion in C++ Nov 18, 2023 pm 03:08 PM

Detaillierte Erläuterung der Modusfunktion in C++ In der Statistik bezieht sich der Modus auf den Wert, der in einem Datensatz am häufigsten vorkommt. In der Sprache C++ können wir den Modus in jedem Datensatz finden, indem wir eine Modusfunktion schreiben. Die Modusfunktion kann auf viele verschiedene Arten implementiert werden. Zwei der häufig verwendeten Methoden werden im Folgenden ausführlich vorgestellt. Die erste Methode besteht darin, eine Hash-Tabelle zu verwenden, um die Häufigkeit des Vorkommens jeder Zahl zu zählen. Zuerst müssen wir eine Hash-Tabelle definieren, in der jede Zahl der Schlüssel und die Häufigkeit des Vorkommens der Wert ist. Dann führen wir für einen bestimmten Datensatz aus

Ausführliche Erklärung zur Erlangung von Administratorrechten in Win11 Ausführliche Erklärung zur Erlangung von Administratorrechten in Win11 Mar 08, 2024 pm 03:06 PM

Das Windows-Betriebssystem ist eines der beliebtesten Betriebssysteme der Welt und seine neue Version Win11 hat viel Aufmerksamkeit erregt. Im Win11-System ist die Erlangung von Administratorrechten ein wichtiger Vorgang. Mit Administratorrechten können Benutzer weitere Vorgänge und Einstellungen auf dem System durchführen. In diesem Artikel wird ausführlich beschrieben, wie Sie Administratorrechte im Win11-System erhalten und wie Sie Berechtigungen effektiv verwalten. Im Win11-System werden Administratorrechte in zwei Typen unterteilt: lokaler Administrator und Domänenadministrator. Ein lokaler Administrator verfügt über vollständige Administratorrechte für den lokalen Computer

Detaillierte Erläuterung der Divisionsoperation in Oracle SQL Detaillierte Erläuterung der Divisionsoperation in Oracle SQL Mar 10, 2024 am 09:51 AM

Detaillierte Erläuterung der Divisionsoperation in OracleSQL In OracleSQL ist die Divisionsoperation eine häufige und wichtige mathematische Operation, die zur Berechnung des Ergebnisses der Division zweier Zahlen verwendet wird. Division wird häufig in Datenbankabfragen verwendet. Daher ist das Verständnis der Divisionsoperation und ihrer Verwendung in OracleSQL eine der wesentlichen Fähigkeiten für Datenbankentwickler. In diesem Artikel werden die relevanten Kenntnisse über Divisionsoperationen in OracleSQL ausführlich erörtert und spezifische Codebeispiele als Referenz für die Leser bereitgestellt. 1. Divisionsoperation in OracleSQL

Detaillierte Erläuterung der Restfunktion in C++ Detaillierte Erläuterung der Restfunktion in C++ Nov 18, 2023 pm 02:41 PM

Detaillierte Erläuterung der Restfunktion in C++ In C++ wird der Restoperator (%) verwendet, um den Rest der Division zweier Zahlen zu berechnen. Es handelt sich um einen binären Operator, dessen Operanden ein beliebiger Ganzzahltyp (einschließlich char, short, int, long usw.) oder ein Gleitkommazahlentyp (z. B. float, double) sein kann. Der Restoperator gibt ein Ergebnis mit demselben Vorzeichen wie der Dividend zurück. Für die Restoperation von Ganzzahlen können wir beispielsweise den folgenden Code zur Implementierung verwenden: inta=10;intb=3;

Detaillierte Erläuterung der Verwendung der Vue.nextTick-Funktion und ihrer Anwendung bei asynchronen Updates Detaillierte Erläuterung der Verwendung der Vue.nextTick-Funktion und ihrer Anwendung bei asynchronen Updates Jul 26, 2023 am 08:57 AM

Detaillierte Erläuterung der Verwendung der Vue.nextTick-Funktion und ihrer Anwendung bei asynchronen Aktualisierungen. Bei der Vue-Entwicklung treten häufig Situationen auf, in denen Daten asynchron aktualisiert werden müssen. Beispielsweise müssen Daten sofort nach einer Änderung des DOM oder verwandter Vorgänge aktualisiert werden unmittelbar nach der Aktualisierung der Daten durchzuführen. Die von Vue bereitgestellte Funktion .nextTick wurde entwickelt, um diese Art von Problem zu lösen. In diesem Artikel wird die Verwendung der Vue.nextTick-Funktion im Detail vorgestellt und mit Codebeispielen kombiniert, um ihre Anwendung bei asynchronen Updates zu veranschaulichen. 1. Vue.nex

Teilen Sie mehrere .NET-Open-Source-KI- und LLM-bezogene Projekt-Frameworks Teilen Sie mehrere .NET-Open-Source-KI- und LLM-bezogene Projekt-Frameworks May 06, 2024 pm 04:43 PM

Die Entwicklung von Technologien der künstlichen Intelligenz (KI) ist heute in vollem Gange und sie haben in verschiedenen Bereichen großes Potenzial und Einfluss gezeigt. Heute wird Dayao Ihnen 4 .NET Open-Source-KI-Modell-LLM-bezogene Projekt-Frameworks vorstellen und hofft, Ihnen einige Referenzen zu geben. https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel ist ein Open-Source-Softwareentwicklungskit (SDK), das für die Integration großer Sprachmodelle (LLM) wie OpenAI und Azure entwickelt wurde

Wie sind die Berufsaussichten von C#? Wie sind die Berufsaussichten von C#? Oct 19, 2023 am 11:02 AM

Ganz gleich, ob Sie Anfänger oder erfahrener Profi sind: Die Beherrschung von C# ebnet den Weg für Ihre Karriere.

Detaillierte Erläuterung der Rolle und Verwendung des PHP-Modulo-Operators Detaillierte Erläuterung der Rolle und Verwendung des PHP-Modulo-Operators Mar 19, 2024 pm 04:33 PM

Der Modulo-Operator (%) in PHP wird verwendet, um den Rest der Division zweier Zahlen zu ermitteln. In diesem Artikel werden wir die Rolle und Verwendung des Modulo-Operators im Detail besprechen und spezifische Codebeispiele bereitstellen, um den Lesern ein besseres Verständnis zu erleichtern. 1. Die Rolle des Modulo-Operators Wenn wir in der Mathematik eine ganze Zahl durch eine andere ganze Zahl dividieren, erhalten wir einen Quotienten und einen Rest. Wenn wir beispielsweise 10 durch 3 dividieren, ist der Quotient 3 und der Rest ist 1. Um diesen Rest zu ermitteln, wird der Modulo-Operator verwendet. 2. Verwendung des Modulo-Operators In PHP verwenden Sie das %-Symbol, um den Modul darzustellen

See all articles