C铉汎型パラメータ変換

2422 ワード

汎型の異なるパラメータタイプが生成するオブジェクトは互いに独立している。

// 
Tuple<string> ts;
Tuple<object> to;
//ts to         。
多くの場合、私たちはto=tsという操作を実現したいですが、なぜですか?そのように見えるからです。
この目的を達成するためには、「汎型パラメータ変換の問題」を解決します。この問題の知識点は、in out汎型変体です。正直に言うと、この問題自体は難しくないです。ただ、とても直観的でなく、忘れられやすいです。
まず、ト=tsを実現するためには、実際に前提があります。このパラメータは「戻りタイプ」にしか使えません。

// 
delegate object FuncObj();
FuncObj func = ()=>"string";
funcが成功したのは、stringがobjectに変換できるからです。「ユーザ」がFncを呼び出すと、望むのはobjectオブジェクトであり、stringもobjectオブジェクトなので、何の問題もありません。
ここでのポイントは「ユーザー」の視点で問題を分析することです。

//A
delegate void FuncObj2(object obj);
FuncObj2 func2 = (string str)=>{};
//B
delegate void FuncStr(string str);
FuncStr func3 = (object obj)=>{};
この二つのコードを分析すると、どちらがより合理的ですか?
ユーザーの角度で、それはfunc 2とfunc 3を使っています。
ユーザーはfunc 2を使って、伝達の対象はきっとobjectですが、実際の処理の関数は(string)=>{}で、objectはstringに変換できないので、とても不合理です。
ユーザーはfunc 3を使って、伝達の対象はstringだけで、実際に処理する関数はobject=>{}で、stringはobjectに変換できるので、合理的です。
もちろん、この2つのコードは、関数パラメータのタイプが一致しないため、成立しません。
しかし、一般的なタイプは、タイプが一致しないオブジェクト間の暗黙的な変換を可能にする方法を提供する。それが実現するロジックは上で分析したものです。

//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修飾はタイプに戻りますが、in修飾パラメータタイプはイメージ的です。ただし、汎型inパラメータはoutパラメータと正反対です。
初めに私達はto=tsを実現したいです。問題の半分だけを見て、実際には普通型はts=toの可能性があるので、読者にこの点を理解してもらいたいです。
まとめ:
out:to=ts
in:ts=to
饰りがない:to、tsは完全に独立しています。
-----------------------------------
outパラメータ:戻りタイプのみに使用できます。
inパラメータ:パラメータのみに使用できます。
修飾なし:任意の位置。
------------------------------------
in、out汎型パラメータは依頼とインターフェースのみに使用できます。

//    
delegate ResultType FuncInOut<in ParamType, out ResultType>(ParamType param);
FuncInOut<object, string> funcobj2 = (object obj) => "string";  
FuncInOut<string, object> func6 = funcobj2;
以上が本文の全部です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてくれると同時に、私達を応援してください。