この質問は、関連する投稿の説明になります。以下の例は、問題の本質を説明していると思います。
class Program
{
public static IList<string> GetData(string arg)
{
return new string[] {"a", "b", "c"};
}
static void Main(string[] args)
{
var arg1 = "abc";
var res1 = GetData(arg1);
Console.WriteLine(res1.Count());
dynamic arg2 = "abc";
var res2 = GetData(arg2);
try
{
Console.WriteLine(res2.Count());
}
catch (RuntimeBinderException)
{
Console.WriteLine("Exception when accessing Count method");
}
IEnumerable<string> res3 = res2;
Console.WriteLine(res3.Count());
}
}
GetDataが動的にキャストされたパラメーターを受け取ったという理由だけでGetDataへの2番目の呼び出しが例外を発生させるのは悪いことではありませんか?メソッド自体はそのような引数で問題ありません。それは文字列として扱い、正しい結果を返します。しかし、結果は再び動的にキャストされ、突然、結果データはその基になるタイプに従って処理できなくなります。例の最後の行にあるように、静的型に明示的にキャストバックされない限り。
なぜこのように実装する必要があるのか理解できませんでした。静的タイプと動的タイプの間の相互運用性を壊します。ダイナミックが使用されると、コールチェーンの残りの部分に感染し、このような問題を引き起こす可能性があります。
更新。Count()は拡張メソッドであり、認識されないことは理にかなっていると指摘する人もいます。次に、res2.Count()の呼び出しをres2.Countに変更しました(拡張メソッドからIlistのプロパティに)が、プログラムは同じ場所で同じ例外を発生させました!今それは奇妙です。
UPDATE2。flqは、このトピックに関するEric Lippertのブログ投稿を指摘しました。この投稿は、このように実装されている理由を十分に説明していると思います。http: //blogs.msdn.com/b/ericlippert/archive/2012/10/22/a -method-group-of-one.aspx