C#では、out
キーワードは2つの異なる方法で使用できます。
-
class OutExample { static void Method(out int i) { i = 44; } static void Main() { int value; Method(out value); // value is now 44 } }
共分散を指定する型パラメーター修飾子として。
// Covariant interface. interface ICovariant<out R> { } // Extending covariant interface. interface IExtCovariant<out R> : ICovariant<R> { } // Implementing covariant interface. class Sample<R> : ICovariant<R> { } class Program { static void Test() { ICovariant<Object> iobj = new Sample<Object>(); ICovariant<String> istr = new Sample<String>(); // You can assign istr to iobj because // the ICovariant interface is covariant. iobj = istr; } }
私の質問は:なぜですか?
初心者にとっては、この2つの接続は直感的に思えません。ジェネリックでの使用は、参照渡しとは何の関係もないようです。
out
参照による引数の受け渡しに関連することを最初に学びましたが、これはジェネリックとの共分散を定義する使用法の理解を妨げました。
私が見逃しているこれらの用途の間に接続はありますか?
System.Func<in T, out TResult>
delegateの共分散と反分散の使用法を見ると、接続が少しわかりやすくなります。