Конструкция 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, которая (на мой взгляд ) должны быть разрешены.
Ответы
Ответ 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);