[C#] VS2015 빌드가 Dynamic에서 오류 메시지없이 실패 함

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로 업그레이드하는 것을 보여주었습니다 …)


답변