English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# ドイナミック型(Dynamic)

C#4.0(.NET 4.5。動的型(dynamic)として新しい型が導入されました。これはコンパイル時の型チェックを避けます。動的类型はコンパイル時に型チェックをスキップし、代わりに実行時に型を解析します。

動的类型変数はキーワード dynamic で定義されます。

dynamic MyDynamicVar = 1;

ほとんどの情况下、コンパイラは動的型をオブジェクト型としてコンパイルします。しかし、動的类型変数の実際の型は実行時に解析されます。

dynamic MyDynamicVar = 1;
Console.WriteLine(MyDynamicVar.GetType());
出力:

System.Int32

動的型は実行時に割り当てられた値に応じて型が変更されます。以下の例では、動的変数が割り当てられた値に応じて型が変更される方法が示されています。

static void Main(string[] args)
{
    dynamic MyDynamicVar = 100;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = "Hello World!!";
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = true;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
    MyDynamicVar = DateTime.Now;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
}
出力:
値:100、型:System.Int32
値:Hello World !!、型:System.String
値:True、型:System.Boolean
値:01-01-2014、型:System.DateTime

動的型変数は他の型に暗黙的に変換されます。

dynamic d1 = 100;
int i = d1;
d1 = "Hello";
string greet = d1;
d1 = DateTime.Now;
DateTime dt = d1;

メソッドとパラメータ

クラスオブジェクトを動的型に割り当てると、コンパイラはカスタムクラスオブジェクトの動的型の正しいメソッドと属性名をチェックしません。以下の例を参照してください。

class Program
{
    static void Main(string[] args)
    {
        dynamic stud = new Student();
        stud.DisplayStudentInfo(1, "Bill");// 実行時エラー、コンパイル時エラーはありません
        stud.DisplayStudentInfo("1");// 実行時エラー、コンパイル時エラーはありません
        stud.FakeMethod();// 実行時エラー、コンパイル時エラーはありません
    }
}
public class Student
{
    public void DisplayStudentInfo(int id)
    {
    }
}

上記の例では、C#コンパイラはパラメータ、パラメータの型、またはそれらが根本的に存在しないことをチェックしません。代わりに、実行時にこれらを確認し、無効な場合にはランタイムエラーをスローします。動的型はVisual Studio IntelliSenseをサポートしません。また、動的型はVisual Studio IntelliSenseをサポートしません。

動的言語実行時(DLR)APIは、C#における動的型の基本構造をサポートしています。