C# 4.0:最新トレンドをマイクロソフト 大野元久氏が解説

杉山貴章(オングス)
2009-01-29 19:10:01
  • このエントリーをはてなブックマークに追加

安全な共変性・反変性

 C# 4.0では共変性と反変性に関しても改善が施されるという。.NETの配列型には共変性があるが、リスト4の例のように安全なものではない。

リスト4 配列の共変性は安全ではない

string[] strings = GetStringArray();
Process(strings);

  ......

void Process(object[] objects) {
     objects[0] = "Hello";            // ok
     objects[1] = new Button();   // 実行時エラー 
}

 一方、C#のジェネリックを利用すれば型チェックが行われるため安全に思えるが、従来のジェネリックにはそもそも共変性がなかった。それに対してC# 4.0のジェネリックでは安全な共変性、反変性が実現されるという。

 具体的には、ジェネリックのタイプパラメータに「in」および「out」の修飾子を付けることによって、共変性および反変性を表現する。例えばリスト5のように、タイプパラメータTにoutを指定した場合、出力側のみ共変性が与えられる。これによってTを派生元の型として扱うことができる。

リスト5 outの場合、共変性は出力側のみ

public interface IEnumetable<out T>
{
IEnumerator<T> GetEnumerator();
}

public interface IEnumerator<out T> 
{
T Current { get; }
bool MoveNext();
}

 一方、リスト6のように、Tにinを指定した場合は、入力側のみ反変性が与えられる。これによってTは派生先の型として扱うことができる。

リスト6 inの場合、反変性は入力側のみ

public interface IComparer<in T>
{
int Compare(T, x, T y);
}

 C# 4.0の変性はインタフェースとデリゲート型をサポートする一方で、値型は変性を持たない。またこの変性の導入によって、.NET Framework 4.0のインタフェースやデリゲートがinおよびout修飾子を持つように変更されるとのことである。

 最後に大野氏は、C# 4.0よりもさらに先の将来の話として、コンパイラの機能を利用可能にするAPIの導入が検討されていると語った。まだ検討レベルの段階とはいえ、メタプログラミングやDSLの埋め込みなどが可能になるかもしれないということで、非常に興味深い話である。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]