ホームページ バックエンド開発 C#.Net チュートリアル C# の汎用パラメーター変換の詳細な紹介

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

Mar 07, 2017 am 11:03 AM

この記事では、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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

C# を使用した Active Directory C# を使用した Active Directory Sep 03, 2024 pm 03:33 PM

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

C# の乱数ジェネレーター C# の乱数ジェネレーター Sep 03, 2024 pm 03:34 PM

C# の乱数ジェネレーターのガイド。ここでは、乱数ジェネレーターの仕組み、擬似乱数の概念、安全な数値について説明します。

C# シリアル化 C# シリアル化 Sep 03, 2024 pm 03:30 PM

C# シリアル化のガイド。ここでは、C# シリアル化オブジェクトの導入、手順、作業、例についてそれぞれ説明します。

C# データ グリッド ビュー C# データ グリッド ビュー Sep 03, 2024 pm 03:32 PM

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

C# のパターン C# のパターン Sep 03, 2024 pm 03:33 PM

C# のパターンのガイド。ここでは、C# のパターンの概要と上位 3 種類について、その例とコード実装とともに説明します。

C# の素数 C# の素数 Sep 03, 2024 pm 03:35 PM

C# の素数ガイド。ここでは、C# における素数の導入と例を、コードの実装とともに説明します。

C# の階乗 C# の階乗 Sep 03, 2024 pm 03:34 PM

C# の Factorial のガイド。ここでは、C# での階乗の概要について、さまざまな例とコード実装とともに説明します。

マルチスレッドと非同期C#の違い マルチスレッドと非同期C#の違い Apr 03, 2025 pm 02:57 PM

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

See all articles