動的型はほとんどの状況でオブジェクト型のように動作し、静的型チェックをバイパスします。コンパイル時に、動的タイプの要素がすべての操作をサポートすると想定されます。
[ソース:MSDN-1、MSDN-2 ]
あなたの場合:
- つまり、動的型の変数を定義すると、それはオブジェクト型のように扱われるため、任意の値を格納し、それを10進数のリストに追加しても、コンパイラはエラーをスローしません。
- ただし、実行時に動的変数の型は「文字列」として解決され、文字列値を10進数のリストに追加しようとしているため、実行時に例外がスローされます。
次のコードを試してみてください。
try
{
dynamic name= "test";
var something = new List<decimal>();
something.Add(name);
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
Console.WriteLine(ex.Message);
}
動的タイプの例:
using System;
class Program
{
static void Main(string[] args)
{
dynamic dynVar = 2;
Console.WriteLine(dynVar.GetType());
}
}
次のように出力されます:
System.Int32
実行しようとしていること:
IDEに次の行を追加するだけで、コンパイル時エラーが表示されます。
List<decimal> dl = new List<decimal>();
dl.Add("Hello");