Visual Studio 2017 및 C # 7.0을 사용하는 메서드에서 Tuple을 반환 할 수 없습니다.


98

일주일 전에 릴리스 된 Visual Studio 2017 Community를 설치했고 C # 7의 새로운 기능을 탐색하기 시작했습니다.

그래서 두 가지 값을 반환하는 간단한 메서드를 만들었습니다.

public class Program
{
    public static void Main(string[] args)
    {
        (int sum, int count) a = ReturnTwoValues();
    }

    static (int sum, int count) ReturnTwoValues() => (1, 1);
}

컴파일러에서 오류가 발생합니다.

오류 CS8137 컴파일러 필수 형식 'System.Runtime.CompilerServices.TupleElementNamesAttribute'를 찾을 수 없기 때문에 튜플을 활용하는 클래스 또는 멤버를 정의 할 수 없습니다. 참조가 누락 되었습니까?

이 이름으로 프레임 워크에서 참조를 찾으려고했지만 운이 없었습니다!

C # 7.0 기능을 사용하기 위해 추가 항목이 필요한 경우 모든 프로젝트에 대해 수행해야하는 것이 매우 이상합니다.


답변:


129

이 작업을 수행하기 위해 다음 단계를 설명하는 Roslyn 에서이 페이지를 살펴 보았습니다 .

  1. C # 프로젝트 시작
  2. System.ValueTuple NuGet (시험판)에서 패키지에 대한 참조 추가

여기에 이미지 설명 입력

이러한 단계에 따라 이제 작동합니다. 그러나 우리가 시작하는 모든 단일 프로젝트에 대해 그렇게해야한다는 것은 정말 이상합니다! 공식 릴리스에 도달하면이 문제가 해결되기를 바랍니다!


2
다음 릴리스에 있어야 할 한 가지는 패키지를 쉽게 추가 할 수있는 코드 수정입니다.
svick

6
이 솔루션이 도움이되었습니다. 2017 년 3 월에 다운로드 된 VS2017 Professional의 정식 릴리스 버전에서도!
NIJ

2
이것이 공식 언어가 아니라는 사실에 매우 짜증이났습니다. 이것이 수정 된 것과 동일한 문제가 발생했습니다. 실제로 C # 7 확장 기능에 더 가깝지만이를 C # 7 언어 기능으로 마케팅하고 있습니다. 나는 당신이 새로운 Roslyn 컴파일러 (내가 좋아하는)를 사용할 때 일이 그렇게 털이 될 수 있다고 생각합니다 ... 어쨌든 이것은 슬픈 부작용 IMO입니다.
Michael Puckett II

10
@MichaelPuckettII 나는이 기능이 .NET 프레임 워크에 존재하기 위해 클래스가 필요하고 아직 새로운 것을 출시하지 않았기 때문에 이것이 임시 해결책이 이것을 Nuget 패키지로 포함시키는 이유라고 생각합니다. 다음 .NET 프레임 워크가 출시되면이 기능에 필요한 클래스가 이미 내장되어 있어야합니다. 그렇지 않다면 설명이 필요한 문제입니다.
제인 Makki

11
.NET 프레임 워크로 바로 업그레이드가 4.7이 오류를받은 후, ValueTuple 밖으로 회전은 튜플 패키지를 제거 할 수 있도록 나를 위해 솔루션을했다, 이제 4.7의 일부입니다
chad.mellor

52

.Net 4.7 Framework를 설치하고 프로젝트를 .Net 4.7을 대상으로 변경 한 후이 오류가 발생하기 시작했습니다.

이제 ValueTuple이 .Net 4.7에 포함되어 있으므로 수동으로 ValueTuple을 참조 할 필요가 없습니다.

컴파일 오류를 수정하기 위해해야 ​​할 일은 내 프로젝트의 참조에서 System.ValueTuple에 대한 참조를 제거하는 것뿐이었습니다.


1
좋습니다. 제안을 따랐습니다. 이제 .NET 4.7에 포함되어 있으므로 더 이상 NuGet에서 설치할 필요가 없습니다. 감사.
Gengjun Wu

이미 .net에서 사용할 수 있습니까? 2019 년입니다. .net 4.7.2
user4951을

2

.NET 4.6.2에서 .NET 4.7.2로 업그레이드하면서이 문제를 겪었습니다. 불행히도 System.ValueTuple내가 사용하는 다른 NuGet 패키지가 이에 의존 하기 때문에 패키지 참조를 제거 할 수 없습니다 .

마지막으로 근본 원인을 찾을 수있었습니다 mscorlib.dll. 프로젝트 폴더 (게시 작업의 출력)에 .NET 4.6.2 버전이 있었고 MSBuild는 공식 .NET 4.7.2 참조 대신이 어셈블리를 참조하기로 결정했습니다. 조립에 있습니다 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2.

System.ValueTuple이 .NET 4.7에 도입 되었기 때문에 MSBuild는 .NET 4.6.2의 참조 어셈블리에서 형식을 찾을 수 없기 때문에 컴파일에 실패했습니다.


1

.NET 4.7.2로 업데이트 한 후에도이 오류가 발생했으며 다음을 사용하여 nuget 패키지를 다시 설치하여 수정할 수있었습니다.

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