2

クラスライブラリとランタイムを含む、ほとんど言語に依存しない.NET Frameworkと、DLRが複数の言語でサポートされているという事実を考えると、C#アプリケーションでサブクラス化されたものが実際に名前空間System.Dynamic.DynamicObjectにある例外をスローするのは奇妙だと思います。実行時に存在しないCSharpメンバーにアクセスしようとすると、次の例外が発生します。dynamic

{Name = "RuntimeBinderException" FullName = "Microsoft.CSharp.RuntimeBinder.RuntimeBinderException"}

例外は RuntimeBinderExceptionC#に固有ですか?その場合、各言語は独自のバインダー例外を実装する必要がありますか?例外がより一般的な名前空間にないのは奇妙なことで、「どうしたの」と思うようになります。

.NET4.5上のVS2012Expressでデバッグモードで実行しています。アプリケーションはC#で構築されました。

4

1 に答える 1

2

名前空間で例外が発生する理由は、DLRが問題のオブジェクトがC#オブジェクトであるとCSharp判断し、処理のためにC#ランタイムバインダーに渡したためです。dynamic

DLRをサポートする各言語には、このランタイムバインディングシステムの独自の実装が必要であり、それぞれが言語のセマンティクスに依存します。たとえば、オンザフライのプロパティとメソッドの作成をサポートするJScriptのような言語は、バインドが失敗するたびに例外をスローするのではなく、新しいプロパティを設定または返します。

したがって、答えは、はい、DLRバインディングの失敗時に例外をスローしたい各言語は、それを個別に実装する必要があるということです。

(別の例として:動的オブジェクトに対するVB.NETのサポートは、既存の遅延バインディングのサポートとまったく同じように機能します。IDispatchたとえば、遅延バインディングの失敗と同じエラーがDLRバインディングの失敗から発生するため、別の例外が必要です。)

于 2013-02-04T01:50:32.380 に答える