C# の汎用パラメーター変換の詳細な紹介
この記事では、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)=>{};
ユーザーの観点からは、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;
---------------------------------(備考)----------- ----- -------------
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) に注目してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

マルチスレッドと非同期の違いは、マルチスレッドが複数のスレッドを同時に実行し、現在のスレッドをブロックせずに非同期に操作を実行することです。マルチスレッドは計算集約型タスクに使用されますが、非同期はユーザーインタラクションに使用されます。マルチスレッドの利点は、コンピューティングのパフォーマンスを改善することですが、非同期の利点はUIスレッドをブロックしないことです。マルチスレッドまたは非同期を選択することは、タスクの性質に依存します。計算集約型タスクマルチスレッド、外部リソースと相互作用し、UIの応答性を非同期に使用する必要があるタスクを使用します。
