VS2015ビルドがDynamicでエラーメッセージなしで失敗する


136

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で、おそらく問題ですので、私はこの質問を開いたままになります。


リンクの障害ではなく、実際にコンパイルの障害であると確信していますか?
デビッドW

やってみdynamic asDynamic = (dynamic)obj;ませんか?または、アサーション内で、動的をコメント化して書き込みAssert.IsTrue(((dynamic)obj).someValue);ます。
Ron Beyer、2015

@RonBeyerはい、運ではなく、それらの両方を試しました。
DLeh 2015

もう一つ... Assert.IsTrue((bool)asDynamic.someValue);
Ron Beyer

1
テストメソッドで動的を使用しようとしたときに、VS2015で同じ問題に直面しました。エラーなしでビルドが失敗しました。そして、Microsoft.CSharp参照を追加した後、ビルドは成功しました。
Sarath Rachuri、2015年

回答:


226

コンパイラエラーが発生しました。VisualStudio 2015はエラーを正しく報告しません。ただし、Visual Studio 2013には次の機能があります。

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

要するに:

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


9
コンパイル時エラーをスローしていなくMicrosoft.CSharpても、dll への参照を追加しusing Microsoft.CSharp;ます。
Barry Guvenkaya 2017年

45
.NETのコア NuGetパッケージを追加するMicrosoft.CSharp代わりに。
Bart Verkoeijen 2017

6
.Net Standardベースのクラスライブラリも同じです-NuGetパッケージMicrosoft.CSharpを追加します。
香港

49

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


3
これにより、プロジェクトを.NET Standardに変換した後の問題が解決しました。ありがとうございます。
Joakim Skoog 2017

1
Excelシートを追加するSSISスクリプトを使用した同上。
SteveCav 2018年

@JoakimSkoog ... .NET Standardプロジェクトでこの問題が発生し(変換されなかった)、それでも手動で参照を追加する必要がありました。
ebol2000 2018

1

.net 3.0プロジェクトでNewtonsoft.jsonと組み合わせてdynamicキーワードを使用してこの問題を抱えていました。

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

から

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

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


0

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

ちなみに、Nugetウィンドウを開くときは、パッケージをダウングレードしないようにしてください(バージョン2.0.11の場合は、実際にダウングレードしているバージョン2.0.9にアップグレードするように指示されていました...)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.