C# 4.0

http://weblogs.asp.net/pgielens/archive/2008/10/27/the-future-of-c-4-0.aspx
http://code.msdn.microsoft.com/csharpfuture

ちゃんと、VS 2010 でのコンパイルに関する話がちらほらあるんで、VS 2010 に C# 4.0 コンパイラ同梱なのかな。

やべぇ、見るもん多い。C# 4.0 のドキュメント → Azure のドキュメント → Azure SDK 入れてみる → VS 2010 入れてみる → C# 4.0 触ってみるの順かなぁ。

New features in C# 4.0

とりあえず、ドキュメント流し読み。
細かい話はいずれ http://ufcpp.net/study/csharp に書くとして、概要を。

新機能は3つ。

  • dynamic lookup
  • 名前付き引数、オプショナル引数
  • generic 型の共変性・反変性

C# 2.0 とか 3.0 は結構衝撃的な内容だったけど、4.0 はちょっと「やっとか」感があるかも。dynamic lookup なんかはすごいのはすごいんですけど。

dynamic lookup

これは過去に MSDN blog で話題になってた通り。結局、dynamic block みたいなのを導入するのではなく、var キーワードのノリで動的変数を定義するみたい。

dynamic d = GetDynamicObject();
d.X = 5;

みたいなのを書くと、d の実体が何かに応じて、

  • COM interop
  • IDynamicObject インターフェースの SetMember, GetMember 呼び出し
  • リフレクションを使ったプロパティアクセス

のどれかにコンパイルされるらしい。

「この機能の真価は DLR で発揮されるよ」とのこと。DLR は .NET Framework 4.0 に標準搭載されるっぽい。

名前付き引数、オプショナル引数

VB にあるあれ。メソッドオーバーロードの解決でややこしいことになるし今まで敬遠されてたのが、ついに折れた。

C++ やってた人からすると、「なんでオプショナル引数がないの?」みたいな感じだったけど、個人的な意見としては、オプショナル引数を導入するなら名前付き引数もセットでないと大した意味がないと思ってたんで、無事両方実装されたということで一安心。

void M(int x = 1, int y = 2, int z = 3)

とか書くと、

M();
M(0);
M(x: 9, y: 8, z: 7);

みたいな書き方ができるようになる。

generic 型の共変性・反変性

これは、今現在 generic 型の共変性・反変性がない理由に関する考察をどこかで見た気が。ちゃんとそれに対する解決策を提示してます。

どういう問題があるかというと、

List<string> strings = {"aa", "bb", "cc"};
List<object> objs = strings;

みたいなことが合法だった場合、

objs[0] = 5; // int に書き換えられたらまずい
string str = strings[0];

みたいなことされる可能性があるから。

これのどこが悪いかというと、List が set 可能なインデクサーを持っていること。なので、値の set ができないインターフェースの場合なら反変性を認めてもいいはず、と。

ということで、generic 型引数に対して in, out が導入されるそうです。in は入力パラメータ(引数)としてしか使われない型に、out は出力パラメーター(戻り値)としてしか使われない型に使われる。

interface IEnumerator<out T>
{
  T Current { get; } // get しかない = 出力のみ
  bool MoveNext();
  void Reset();
}
interface IComparer<in T>
{
  int Compare(T a, T b); // T は引数としてしか使われない
}

こうやれば、in の方には共変性、out の方には反変性が認められると。

IEnumerable<object> objs = new List<string> { "aa", "bb", "cc" }; // 今後は OK に。