Подтвердить что ты не робот

Конструкция VS2015 завершается с ошибкой без сообщения об ошибке с динамическим

Я писал unit test на фрагменте кода, который возвращал JSON. Тип, который он возвращает, является анонимным типом, поэтому я решил проверить значения на нем. Я просто применил объект к dynamic для выполнения моих утверждений.

Однако, когда я это делаю, моя сборка выходит из строя, но у меня нет сообщений об ошибках. Я смог воспроизвести это с помощью очень простого кода в новом проекте unit test:

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

    dynamic asDynamic = obj;

    Assert.IsTrue(asDynamic.someValue);
}

Ниже приведен снимок экрана с ошибкой сборки

build failing

Строка завершается успешно, когда я комментирую это утверждение:

build successing without assert

В отличие от этого, я запускал следующий код в бета-версии LinqPad 5 (который использует компилятор Roslyn) и не имел проблем:

var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());

True

Что здесь происходит? Поскольку ошибка не отображается, я не могу сказать, неправильно ли я использую 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, которая (на мой взгляд ) должны быть разрешены.

4b9b3361

Ответ 1

Существует ошибка компилятора, Visual Studio 2015 просто не сообщает об ошибке. Однако Visual Studio 2013 делает:

На это отвечает: fooobar.com/questions/89192/...:

Короче:

Добавьте ссылку на Microsoft.CSharp, чтобы использовать dynamic, как это.

Ответ 2

Как отметили два человека в комментариях, для Net Core и NetStandard эту проблему иногда исправляют добавлением ссылки NuGet на Microsoft.CSharp.

Ответ 3

Известна проблема с ошибками сборки, которые не отображаются в списке ошибок. См., Например, https://github.com/dotnet/roslyn/issues/4567.

Чтобы обойти это, в окне "Список ошибок" выберите раскрывающееся меню справа от "Messages" и выберите "Build + IntelliSense".

Ответ 4

У меня была аналогичная проблема, и единственное, что ее разрешило, - это обновить пакет NUnit до последней версии.

Кстати, когда вы открываете окно Nuget, убедитесь, что вы не снижаете свой пакет (когда у меня была версия 2.0.11, мне было показано, что я обновляюсь до версии 2.0.9, которая фактически понижает рейтинг...)

Ответ 5

Если эта проблема использовалась с использованием динамического ключевого слова в сочетании с Newtonsoft.json в проекте .net 3.0.

Исправление должно было полностью отбросить динамику и вместо этого использовать JObject:

от

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

к

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