1. ホーム
  2. c#

[解決済み] VS2015 のビルドがエラーメッセージなしで失敗し、Dynamic が表示される。

2022-06-29 06:10:18

質問

JSONを返すコードの一部でユニットテストを書いていました。それが返す型は無名型であり、私はそれの値を検証するために、オブジェクトを dynamic にキャストしてアサーションを行うことにしました。

しかし、私がそれを行うとき、私のビルドは失敗しますが、私はエラーメッセージを持ちません。新しいユニット テスト プロジェクトで、非常に単純なコードでこれを再現することができました。

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

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

アサーションをコメントアウトするとビルドが成功するのですが。

一方、LinqPad 5 beta (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);

よく見てみると、Outputウィンドウにエラーが表示されていました。

c:...\DynamicBuildFailTestUnitTest1.cs(16,33,16,42): error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

なるほど、VS2013の方がエラーの報告が多いので、それを元に検索してみます。

よし への参照を追加すると、ビルドエラーが修正されました。 しかし、おそらく VS2015 の問題であり、(私の考えでは)解決されるはずなので、この質問をオープンにしておきます。

どのように解決するのですか。

コンパイラーエラーがあり、Visual Studio 2015 はエラーを適切に報告しないだけです。しかし、Visual Studio 2013 はエラーを報告します。

こちらで回答しています。 https://stackoverflow.com/a/13568247 :

要するに

<ブロッククオート

Microsoft.CSharpへの参照を追加することで、以下のように dynamic をこのようにします。