Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die generische C#-Parameterkonvertierung

Detaillierte Einführung in die generische C#-Parameterkonvertierung

黄舟
黄舟Original
2017-03-07 11:03:061463Durchsuche

In diesem Artikel werden die relevanten Kenntnisse der generischen C#-Parameterkonvertierung vorgestellt, die einen guten Referenzwert haben.

Die von verschiedenen Parametertypen generierten Objekte sind unabhängig gegenseitig.

//如
Tuple<string> ts;
Tuple<object> to;
//ts to 是两个类型的对象。

Oft möchten wir den to = ts-Vorgang implementieren, warum? Weil es so aussieht, als ob es so sein sollte.

Um dieses Ziel zu erreichen, ist es notwendig, das „Problem der generischen Parameterkonvertierung“ zu lösen. Der Wissenspunkt dieses Problems ist die generische In-Out-Variante. Um ehrlich zu sein, ist das Problem an sich nicht schwierig, es ist nur sehr unintuitiv und man vergisst es leicht.

Um to = ts zu realisieren, gibt es zunächst tatsächlich eine Voraussetzung, das heißt, dieser Parameter kann nur für den „Rückgabetyp“ verwendet werden.

//如
delegate object FuncObj();
FuncObj func = ()=>"string";

Der Grund, warum func erfolgreich ist, liegt darin, dass ein String in ein Objekt konvertiert werden kann. Wenn der „Benutzer“ func aufruft, hofft er, das Objektobjekt zu erhalten, und die Zeichenfolge ist ebenfalls ein Objektobjekt, sodass kein Problem besteht.

Der Schlüssel hier liegt darin, zu lernen, Probleme aus der „Benutzer“-Perspektive zu analysieren.

//A
delegate void FuncObj2(object obj);
FuncObj2 func2 = (string str)=>{};
//B
delegate void FuncStr(string str);
FuncStr func3 = (object obj)=>{};

Analysieren Sie diese beiden Codesätze. Welcher ist sinnvoller?

Aus Sicht des Benutzers werden func2 und func3 verwendet

Wenn der Benutzer func2 verwendet, muss das übergebene Objekt ein Objekt sein, aber die tatsächlich verarbeitete Funktion ist (string)=> {}, das Objekt kann nicht in eine Zeichenfolge konvertiert werden, daher ist dies sehr unvernünftig.

Wenn Benutzer func3 verwenden, kann das übergebene Objekt nur ein String sein, aber die tatsächlich verarbeitete Funktion ist (object)=>{} und kann in ein Objekt konvertiert werden, was sinnvoll ist.

Natürlich sind diese beiden Codesätze nicht gültig, da die Funktionsparametertypen nicht übereinstimmen.

Generika bieten jedoch eine Methode zur impliziten Konvertierung von Objekten mit nicht übereinstimmenden Typen! Die implementierte Logik wird oben analysiert.

//out 修饰返回类型
delegate ResultType FuncOut<out ResultType>();
//in 修饰参数类型
delegate void FuncIn<in ParamType>(ParamType param);
//这是一开始我们想做到的目标
FuncOut<object> fun4 = () => "string";
//这个效果恰好相反
FuncIn<object> funcobj = (object obj) => { };
FuncIn<string> fun5 = funcobj;
//注意,泛型变体一般只能和泛型变体之间隐式转换
//lambda表达式会自动转换成参数相同的泛型变体,但无法接着做变体之间的隐式转换,所以需要funcobj来过渡

out ändert den Rückgabetyp und in ändert den Parametertyp, was ziemlich anschaulich ist, aber achten Sie auf den generischen in-Parameter, der ist genau das Gegenteil des Out-Parameters.

Zuerst wollten wir to = ts implementieren, aber wir sahen nur die Hälfte des Problems. Tatsächlich besteht die Möglichkeit von ts = to in Generika. Ich hoffe, die Leser können dies verstehen.

Zusammenfassung:

out : to = ts;
in : ts = to;

Keine Änderung: bis, ts sind völlig unabhängig.

----------- (Bemerkungen)------------- -- -
out-Parameter: kann nur in Rückgabetypen verwendet werden.

in Parameter: Kann nur in Parametern verwendet werden.

Keine Änderung: jede Position.

-----------(Hinweis 2)------------- - -----------------

Generische In- und Out-Parameter können nur für Delegaten und Schnittstellen verwendet werden.

//综合运用
delegate ResultType FuncInOut<in ParamType, out ResultType>(ParamType param);
FuncInOut<object, string> funcobj2 = (object obj) => "string";  
FuncInOut<string, object> func6 = funcobj2;

Das Obige ist die detaillierte Einführung in die generische C#-Parameterkonvertierung. 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