Збірка VS2015 не вдається без повідомлення про помилку з Dynamic


136

Я писав одиничний тест на фрагменті коду, який повернув JSON. Тип, який він повертає, - це анонімний тип, тому я думав перевірити значення на ньому, я би просто кинув об'єкт на а, dynamicщоб зробити свої твердження.

Однак коли я це роблю, моя збірка не вдається, але у мене немає жодних повідомлень про помилки. Мені вдалося відтворити це за допомогою дуже простого коду в новому проектному проекті Unit:

[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, яку (на мій погляд) слід вирішити.


Ви впевнені, що це насправді збій компіляції, а не збій посилання?
David W

Можна спробувати dynamic asDynamic = (dynamic)obj;? Або просто у твердженні прокоментуйте динаміку та напишіть Assert.IsTrue(((dynamic)obj).someValue);.
Рон Бейер

@RonBeyer так, я намагався і те, і інше, не пощастило.
DLeh

Ще один ... Assert.IsTrue((bool)asDynamic.someValue);?
Рон Бейер

1
Я зіткнувся з тією ж проблемою в VS2015, намагаючись використовувати динамічні методи тестування. Помилка збірки без помилок. І після додавання посилання Microsoft.CSharp збірка вдалася.
Сарат Рачурі

Відповіді:


226

Існує помилка компілятора, Visual Studio 2015 просто не повідомляє про помилку належним чином. Однак Visual Studio 2013 робить:

На це відповідь тут: https://stackoverflow.com/a/13568247 :

Коротко:

Додайте посилання на Microsoft.CSharp, щоб використовувати dynamicтаке.


9
Додайте посилання на Microsoft.CSharpdll, навіть якщо using Microsoft.CSharp;не викидає помилку часу компіляції.
Barry Guvenkaya

45
За допомогою .NET CoreMicrosoft.CSharp замість цього додайте пакет NuGet .
Барт Веркойейн

6
Те саме для бібліотеки класів на базі .Net Standard - додайте пакет NuGet Microsoft.CSharp.
Гонг

50

Як відзначили двоє людей у ​​коментарях, для Net Core та NetStandard ця проблема іноді вирішується шляхом додавання посилання на NuGet до Microsoft.CSharp.


3
Це вирішило мою проблему після перетворення проекту в .NET Standard, дякую!
Йоаким Скоог

1
Дітто із сценарієм SSIS, додаючи лист Excel.
SteveCav

@JoakimSkoog ... У мене була ця проблема у проекті .NET Standard (ніколи не конвертована) і все ж доводилося додавати посилання вручну.
ebol2000

1

Якщо у цій проблемі було використано динамічне ключове слово в поєднанні з Newtonsoft.json у проекті .net 3.0.

Виправлення полягало у тому, щоб взагалі відмовитись від динаміки та використовувати JObject:

з

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

до

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

0

Відома проблема з помилками побудови, які не відображаються у списку помилок. Див., Наприклад, https://github.com/dotnet/roslyn/isissue/4567 .

Щоб обійти це, у вікні "Список помилок" виберіть спадне меню праворуч від "Повідомлення" та виберіть "Збірка + IntelliSense".


0

У мене була подібна проблема, і єдине, що вирішило мені це - оновити мій пакет NUnit до останньої версії.

До речі, коли ви відкриваєте вікно Nuget, переконайтесь, що ваш пакет не погіршує ваш пакет (коли я мав версію 2.0.11, він показав мені оновлення до версії 2.0.9, що насправді понижує версію ...)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.