C# の dynamic 型
C# の dynamic 型とは?
C# の dynamic 型を使うと、コンパイル時の型のチェックが行われなくなります。 その代わり、実行時に型のチェックが行われます。
これによって、COM オブジェクトの参照や HTML DOM オブジェクトの参照など、 実行時に動的に変わるオブジェクトのメソッド呼び出しが行えるようになります。
C# の dynamic 型を試してみる
dynamic 型を利用する動機は、上述の通り実際に実行時にしか型がわからないような状況に対応するためですが、 本来コンパイル時に型情報がわかる場合にも使えます。
具体例をみてみましょう。
次のサンプルコードでは Foo というクラスに Hello() というメソッドのみを定義しています。
using System;
class Foo
{
string name;
public Foo(string name)
{
this.name = name;
}
public void Hello()
{
Console.WriteLine($"Hello, {this.name}.");
}
}
ところが、この Foo クラスを利用する箇所で、存在しない Bar() メソッドを呼び出しています。
class Program
{
static void Main(string[] args)
{
dynamic foo = new Foo("John");
foo.Bar();
}
}
明らかな間違いのあるコードです。
しかし、ここでは Foo オブジェクトを dynamic 型の変数で作成しているために、 コンパイル時の型チェックは行われません。このために、このプログラムはビルドできます。
dotnet build
Microsoft (R) Build Engine version 16.7.0-preview-20360-03+188921e2f for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
...
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:01.03
このプログラムを実行すると、次のようなエラーが発生します。
dotnet run
Unhandled exception. Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Foo' does not contain a definition for 'Bar'
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid1[T0](CallSite site, T0 arg0)
at Program.Main(String[] args) in /Users/...
以上、C# の dynamic 型について説明しました。