JSONを返すコードの単体テストを書いていました。それが返す型は匿名型であるため、その値を検証するために、オブジェクトをdynamic
にキャストしてアサーションを実行したいと考えました。
ただし、その場合、ビルドは失敗しますが、エラーメッセージは表示されません。新しい単体テストプロジェクトで非常に簡単なコードでこれを再現できました。
[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
を間違って使用しているか、dynamic
が原因でIsTrue()
に使用するオーバーロードが見つからないか、またはこれがコンパイラのバグかどうかはわかりません(ただし、これを非常に疑い、私のコードに何か問題があるという証拠はありません)。
オーバーロードの問題に関しては、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の(おそらく私の考えでは)解決すべき問題であるため、この質問は公開したままにします。
コンパイラエラーがあります。VisualStudio 2015はエラーを適切に報告しません。ただし、Visual Studio 2013は以下を実行します。
これはここで答えられます: https://stackoverflow.com/a/13568247 :
要するに:
このように
dynamic
を使用するには、Microsoft.CSharpへの参照を追加します。
2人がコメントで指摘しているように、Net CoreとNetStandardの場合、この問題はNuGet参照をMicrosoft.CSharp
に追加することで修正されることがあります。
エラーリストにビルドエラーが表示されないという既知の問題があります。たとえば、 https://github.com/dotnet/roslyn/issues/4567 を参照してください。
これを回避するには、[エラーリスト]ウィンドウで、[メッセージ]の右側にあるプルダウンメニューを選択し、[ビルド+ IntelliSense]を選択します。
.net 3.0プロジェクトでNewtonsoft.jsonと組み合わせて動的キーワードを使用してこの問題が発生しました。
修正は、動的を完全に削除し、代わりにJObjectを使用することでした。
から
dynamic locales = JObject.Parse(this.Locales);
に
JObject locales = JObject.Parse(this.Locales);
同様の問題があり、それを解決したのは、NUnitパッケージを最新バージョンにアップグレードすることだけでした。
ところで、Nugetウィンドウを開くときは、パッケージをダウングレードしていないことを確認してください(バージョン2.0.11を使用していたときに、実際にダウングレードしているバージョン2.0.9にアップグレードすることを示しました...)