C#4.0の新機能

C# 4.0 の新機能 (C# によるプログラミング入門)
http://ufcpp.net/study/csharp/ap_ver4.html
概要、動的型付け変数、オプション引数・名前付き引数、ジェネリックの反変性・共変性、COM相互運用時の特別処理


C#4.0の新機能は大きく分けると、
動的型付け変数、
オプション引数・名前付き引数、
ジェネリックの反変性・共変性
の3つ。今後大幅な変更は無いが、C#4.0の仕様はこれで確定ではない。(2008/11)


動的型付け変数
dynamicキーワードを変数につける。
スクリプト言語と連携したりDLLの遅延バインディングしたりするために、コンパイル時に確定しないプロパティアクセスメソッドが呼び出せる。
varと似てるが、dynamicは動的型(dynamic型)という型になる点が違う。

static dynamic GetX(dynamic obj)
{
  return obj.X;
}

と書くと、objがプロパティXを持っていなくても、コンパイルエラーは出ない。実行時にXを持っているかが調べられる。


オプション引数・名前付き引数
C++, VBにある機能。

static int Sum(int x = 0, int y = 0, int z = 0)
{
  return x + y + z;
}

のようにデフォルト値を指定した引数を書くことで、引数の一部または全部を省略できるようになる。
ただし、前の引数だけを省略することはできない。任意の箇所を省略するには、名前付き引数を使って呼び出すとよい。↓

int s3 = Sum(z: 1, y: 2); //  前の引数xだけ省略できる。


ジェネリックの反変性・共変性
ジェネリクスの型引数にin, outを付けることで、共変性・反変性を持たせることが可能になった。
戻り値でしか使わない型にoutを付けることで共変性が可能に。
引数にしか使わない型にinを付けることで反変性が可能に。


COM相互運用時の特別処理
COMのクラスを.NETのクラスのように扱える。
COM 相互運用用のクラス(Runtime Callable Wrapper)だけは特別な処理がされる。
・ref引数(参照渡し)に対してrefキーワードをつけなくても呼び出しできる。
・get_X(index)、set_X(index, value) というメソッドに対して、インデックス付きプロパティX[index]が使えるようになった。