web-dev-qa-db-ja.com

VS2015ビルドがダイナミックでエラーメッセージなしで失敗する

JSONを返すコードの単体テストを書いていました。それが返す型は匿名型であるため、その値を検証するために、オブジェクトをdynamicにキャストしてアサーションを実行したいと考えました。

ただし、その場合、ビルドは失敗しますが、エラーメッセージは表示されません。新しい単体テストプロジェクトで非常に簡単なコードでこれを再現できました。

[TestMethod]
public void TestMethod1()
{
    var obj = new { someValue = true };

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

失敗したビルドのスクリーンショットについては、以下を参照してください

build failing

ただし、アサーションをコメントアウトすると、ビルドは成功します。

build succeeding without assert

対照的に、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はエラーの報告が優れているので、それらに基づいて検索します:

enter image description here

わかりました、 Microsoft.CSharpへの参照を追加するとビルドエラーが修正されました 、ただし、VS2015の(おそらく私の考えでは)解決すべき問題であるため、この質問は公開したままにします。

119
DLeh

コンパイラエラーがあります。VisualStudio 2015はエラーを適切に報告しません。ただし、Visual Studio 2013は以下を実行します。

これはここで答えられます: https://stackoverflow.com/a/13568247

要するに:

このようにdynamicを使用するには、Microsoft.CSharpへの参照を追加します。

206
DLeh

2人がコメントで指摘しているように、Net CoreとNetStandardの場合、この問題はNuGet参照をMicrosoft.CSharpに追加することで修正されることがあります。

36

エラーリストにビルドエラーが表示されないという既知の問題があります。たとえば、 https://github.com/dotnet/roslyn/issues/4567 を参照してください。

これを回避するには、[エラーリスト]ウィンドウで、[メッセージ]の右側にあるプルダウンメニューを選択し、[ビルド+ IntelliSense]を選択します。

0
Neal Gafter

.net 3.0プロジェクトでNewtonsoft.jsonと組み合わせて動的キーワードを使用してこの問題が発生しました。

修正は、動的を完全に削除し、代わりにJObjectを使用することでした。

から

dynamic locales = JObject.Parse(this.Locales);

JObject locales = JObject.Parse(this.Locales);
0
Dan Ochiana

同様の問題があり、それを解決したのは、NUnitパッケージを最新バージョンにアップグレードすることだけでした。

ところで、Nugetウィンドウを開くときは、パッケージをダウングレードしていないことを確認してください(バージョン2.0.11を使用していたときに、実際にダウングレードしているバージョン2.0.9にアップグレードすることを示しました...)

0
silver