[解決済み】ジェネリックの<out T>と<T>の比較
質問
とはどのような違いがあるのでしょうか?
<out T>
と
<T>
? 例えば
public interface IExample<out T>
{
...
}
vs.
public interface IExample<T>
{
...
}
解決方法は?
その
out
キーワードは、インターフェイスの型Tが共変であることを示すために使用されます。 参照
共分散と共分散
をご覧ください。
古典的な例としては
IEnumerable<out T>
. このため
IEnumerable<out T>
は共変数なので、次のようにしてもよい。
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
文字列はオブジェクトから派生するので、論理的にはうまくいくはずですが、これが共変数でなければ、上の2行目は失敗します。 以前は ジェネリックインターフェースにおける分散 がC#とVB.NETに追加されたとき(VS 2010の.NET 4)、これはコンパイル時のエラーになりました。
.NET 4 以降は。
IEnumerable<T>
はcovariantとマークされ、次のようになりました。
IEnumerable<out T>
. このため
IEnumerable<out T>
はその中の要素だけを使用し、要素を追加したり変更したりすることはありません。 文字列の列挙可能なコレクションをオブジェクトの列挙可能なコレクションとして扱うのは安全です。
コバリアント
.
のような型ではうまくいきません。
IList<T>
というのは
IList<T>
には
Add
メソッドを使用します。 仮にこれが許されるとすると
IList<string> strings = new List<string>();
IList<object> objects = strings; // NOTE: Fails at compile time
そして、呼び出すことができます。
objects.Add(new Image()); // This should work, since IList<object> should let us add **any** object
もちろん、これは失敗です。
IList<T>
は共変量とマークすることはできません。
また、オプションとして
in
- これは、比較インターフェースなどで使用されます。
IComparer<in T>
は、例えば、逆の動作をします。 具体的な
IComparer<Foo>
を直接
IComparer<Bar>
もし
Bar
のサブクラスです。
Foo
というのは
IComparer<in T>
インターフェースは
反変数
.
関連
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] AddTransient、AddScoped、AddSingleton サービスの相違点
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] SelectとSelectManyの違い
-
[解決済み] IEnumerable<T> と IQueryable<T> を比較する。
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない