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


136

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의 문제 (아마도 내 마음에)가 해결되어야하기 때문에이 질문을 열어 두겠습니다.


실제로 링크 오류가 아닌 컴파일 오류인지 확인 하시겠습니까?
David W

당신은 시도 할 수 있습니까 dynamic asDynamic = (dynamic)obj;? 또는 어설 션에서 동적을 주석 처리하고을 쓰십시오 Assert.IsTrue(((dynamic)obj).someValue);.
Ron Beyer

@ RonBeyer 네, 두 가지를 모두 시도했지만 운이 아닙니다.
DLeh

하나 더 ... Assert.IsTrue((bool)asDynamic.someValue);?
Ron Beyer

1
테스트 방법에서 동적을 사용하는 동안 VS2015에서 동일한 문제에 직면했습니다. 오류없이 빌드가 실패했습니다. 그리고 Microsoft.CSharp 참조를 추가 한 후 빌드가 성공했습니다.
Sarath Rachuri

답변:


226

컴파일러 오류가 있으며 Visual Studio 2015는 오류를 올바르게보고하지 않습니다. 그러나 Visual Studio 2013은 다음을 수행합니다.

https://stackoverflow.com/a/13568247 : 여기에 대답

한마디로 :

dynamic이와 같이 사용하려면 Microsoft.CSharp에 대한 참조를 추가하십시오 .


9
컴파일 시간 오류가 발생하지 Microsoft.CSharp않더라도 dll에 대한 참조를 추가하십시오 using Microsoft.CSharp;.
Barry Guvenkaya

45
.NET Core를 사용 하면 NuGet 패키지를 Microsoft.CSharp대신 추가하십시오 .
Bart Verkoeijen

6
.Net 표준 기반 클래스 라이브러리와 동일-NuGet 패키지 Microsoft.CSharp를 추가하십시오.
Hong

50

Net Core 및 NetStandard에 대해 두 사람이 의견에서 언급했듯이이 문제는 때때로 NuGet 참조를 추가하여 수정됩니다 Microsoft.CSharp.


3
이것은 프로젝트를 .NET Standard로 변환 한 후 내 문제를 해결했습니다. 감사합니다!
Joakim Skoog

1
Excel 시트를 추가하는 SSIS 스크립트가있는 Ditto.
SteveCav

@JoakimSkoog ... .NET 표준 프로젝트 (이 변환되지 않음) 에서이 문제가 있었지만 여전히 수동으로 참조를 추가해야했습니다.
ebol2000

1

.net 3.0 프로젝트에서 Newtonsoft.json과 함께 동적 키워드를 사용 하여이 문제가 발생했습니다.

수정은 동적을 완전히 삭제하고 대신 JObject를 사용하는 것입니다.

...에서

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

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


0

비슷한 문제가 있었고 그것을 해결 한 유일한 것은 NUnit 패키지를 최신 버전으로 업그레이드하는 것입니다.

그건 그렇고 Nuget 창을 열 때 패키지를 다운 그레이드하지 않는지 확인하십시오 (버전 2.0.11이있을 때 실제로 다운 그레이드하는 버전 2.0.9로 업그레이드하는 것을 보여주었습니다 ...)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.