dynamicによる動的型付け変数

変数と式 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
dynamic - C# によるプログラミング入門 | ++C++; // 未確認飛行 C


これは凄い機能ですね。変数の型をコンパイル時ではなく実行時に決めるようにする変数です。

using System;

class CClass {
    public string str;
}

class Program {
    static void Foo(object obj) {
        Console.WriteLine( obj.str );
    }
    
    static void Main() {
        var cobj = new CClass{ str = "foo" };
        Foo(cobj);
    }
}

例えば上記コードはコンパイルエラーになります。

$ csc main.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.

main.cs(9,26): error CS1061: 'object' に 'str' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

object型のobj変数がstrを持っているかどうかはコンパイル時にはわからないからですね。

でもdynamic型を使えばこれを実行時に動的に判断して割り当てるようになります。

    // dynamic型で受け取る
    static void Foo(dynamic obj) {
        Console.WriteLine( obj.str );
    }
$ main
foo

コンパイルが通り実行できます。

なかなかに凄い機能ですがこれを使いすぎると結局コンパイル時チェックの利点を活かせないので、限られた状況で使うのが良いみたいです。

具体的には上記URLに書かれているのでまたいずれちゃんと読みます。