JSONを返すコードの単体テストを書いていました。それが返す型は匿名型であるためdynamic
、アサーションを行うためにオブジェクトをa にキャストするだけで、その値を検証することを考えました。
しかし、それを行うとビルドが失敗しますが、エラーメッセージは表示されません。これを非常に単純なコードで新しい単体テストプロジェクトで再現できました。
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
失敗したビルドのスクリーンショットについては、以下を参照してください
ただし、アサーションをコメント化すると、ビルドは成功します。
対照的に、LinqPad 5ベータ(Roslynコンパイラを使用)で次のコードを実行しましたが、問題はありませんでした。
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
本当
何が起きてる?エラーは、私は私が使用している場合は言うことができない表示されていないのでdynamic
、それがために使用するための過負荷を見つけることができない場合は、誤って、またはIsTrue()
ためのdynamic
、またはこれがコンパイラのバグかどうか(ただし、これは非常に疑わしいですが) 、コードに問題があるという証拠はありません)。
過負荷の問題については、試してみましたAssert.IsTrue((bool)asDynamic.someValue);
が、ビルドはまだ失敗し、エラーメッセージは表示されません。
@RonBeyerのコメントに従って、私は以下のようなより多くのキャストを試みましたが、役に立たなかった:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
詳細に調べたところ、出力ウィンドウにエラーが表示されていることがわかりました。
c:... \ DynamicBuildFailTest \ UnitTest1.cs(16,33,16,42):エラーCS0656:コンパイラーが必要なメンバー 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'がありません
さて、VS2013はエラーの報告に優れています。これらに基づいて検索します。
さて、Microsoft.CSharpへの参照を追加すると、ビルドエラーを修正し、それは(私の心の中では)解決されるべきであるとVS2015で、おそらく問題ですので、私はこの質問を開いたままになります。
dynamic asDynamic = (dynamic)obj;
ませんか?または、アサーション内で、動的をコメント化して書き込みAssert.IsTrue(((dynamic)obj).someValue);
ます。
Assert.IsTrue((bool)asDynamic.someValue);
?