ホームページ  >  記事  >  バックエンド開発  >  C# の汎用パラメーター変換の詳細な紹介

C# の汎用パラメーター変換の詳細な紹介

黄舟
黄舟オリジナル
2017-03-07 11:03:061426ブラウズ

この記事では、C# のジェネリック パラメーター変換に関する関連知識を紹介します。エディターで見てみましょう。ジェネリックのさまざまなパラメーターの型によって生成されるオブジェクトは、互いに独立しています。

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

to = ts 演算を実装したいと思うことがよくありますが、なぜでしょうか?そうあるべきように見えるからです。

この目標を達成するには、「汎用パラメータ変換問題」を解く必要があります。この問題の知識ポイントは、in out 汎用バリアントです。正直に言うと、問題自体は難しいものではなく、非常に直感的ではなく忘れやすいだけです。

まず、to = tsを実現するには、実際には前提条件があります。それは、このパラメータは「戻り値の型」でのみ使用できるということです。

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

funcは文字列をオブジェクトに変換できたので成功しました。 「ユーザー」が func を呼び出すとき、取得したいのは object オブジェクトであり、string も object オブジェクトであるため、問題はありません。

ここで重要なのは、「ユーザー」の観点から問題を分析する方法を学ぶことです。

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

これら 2 つのコード セットを分析してください。どちらがより合理的ですか?

ユーザーの観点からは、func2とfunc3を使用します

ユーザーがfunc2を使用する場合、渡されるオブジェクトはオブジェクトである必要がありますが、実際に処理される関数は(string)=>{}であるため、オブジェクトを文字列に変換することはできません。それは非常に不合理です。

ユーザーが func3 を使用する場合、渡されるオブジェクトは文字列のみであり、実際に処理される関数は (オブジェクト)=>{} であるため、文字列をオブジェクトに変換できます。

もちろん、関数のパラメーターの型が一致しないため、これら 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 はパラメーターの型を変更します。これは非常に鮮やかですが、out パラメーターの正反対である汎用の in パラメーターに注意してください。

最初は to = ts を実装したいと考えていましたが、実際には問題の半分しか見えていませんでした。読者の皆様にはこれを理解していただければ幸いです。

概要:

out : to = ts;
in : ts = to;
変更なし: to、ts は完全に独立しています。

---------------------------------(備考)----------- ----- -------------

out パラメータ: 戻り値の型でのみ使用できます。


in パラメータ: パラメータ内でのみ使用できます。

変更なし: どこでも。

---------------------------------(注2)----------- ------ -------------

in および out のジェネリック パラメーターは、デリゲートとインターフェイスでのみ使用できます。

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

上記は C# の汎用パラメーター変換の詳細な紹介です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。




声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。