JSON을 반환하는 코드에 단위 테스트를 작성했습니다. 그것이 반환하는 유형은 익명 유형이므로 그 값을 확인하고 객체를 어서 dynamic
내 어설 션을 수행 한다고 생각했습니다 .
그러나 그렇게하면 빌드가 실패하지만 오류 메시지가 없습니다. 새로운 단위 테스트 프로젝트에서 매우 간단한 코드로 이것을 재현 할 수있었습니다.
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
빌드 실패의 스크린 샷은 아래를 참조하십시오.
그래도 어설 션을 주석 처리하면 빌드가 성공합니다.
대조적으로, 나는 Rosq 컴파일러를 사용하는 LinqPad 5 베타에서 다음 코드를 실행했으며 아무런 문제가 없었습니다.
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의 문제 (아마도 내 마음에)가 해결되어야하기 때문에이 질문을 열어 두겠습니다.
답변
컴파일러 오류가 있으며 Visual Studio 2015는 오류를 올바르게보고하지 않습니다. 그러나 Visual Studio 2013은 다음을 수행합니다.
https://stackoverflow.com/a/13568247 : 여기에 대답
한마디로 :
dynamic
이와 같이 사용하려면 Microsoft.CSharp에 대한 참조를 추가하십시오 .
답변
Net Core 및 NetStandard에 대해 두 사람이 의견에서 언급했듯이이 문제는 때때로 NuGet 참조를 추가하여 수정됩니다 Microsoft.CSharp
.
답변
.net 3.0 프로젝트에서 Newtonsoft.json과 함께 동적 키워드를 사용 하여이 문제가 발생했습니다.
수정은 동적을 완전히 삭제하고 대신 JObject를 사용하는 것입니다.
…에서
dynamic locales = JObject.Parse(this.Locales);
에
JObject locales = JObject.Parse(this.Locales);
답변
오류 목록에 빌드 오류가 나타나지 않는 알려진 문제가 있습니다. 예를 들어 https://github.com/dotnet/roslyn/issues/4567을 참조하십시오 .
이 문제를 해결하려면 “오류 목록”창에서 “메시지”오른쪽에있는 풀다운 메뉴를 선택하고 “빌드 + IntelliSense”를 선택하십시오.
답변
비슷한 문제가 있었고 그것을 해결 한 유일한 것은 NUnit 패키지를 최신 버전으로 업그레이드하는 것입니다.
그건 그렇고 Nuget 창을 열 때 패키지를 다운 그레이드하지 않는지 확인하십시오 (버전 2.0.11이있을 때 실제로 다운 그레이드하는 버전 2.0.9로 업그레이드하는 것을 보여주었습니다 …)