사전 정의 된 유형 'System.ValueTuple´2'가 정의되지 않았거나 가져 오지 않았습니다.


385

Visual Studio 15 Preview 3을 설치하고 새로운 튜플 기능을 사용하려고했습니다.

static void Main(string[] args)
{
    var x = DoSomething();
    Console.WriteLine(x.x);
}

static (int x, int y) DoSomething()
{
    return (1, 2);
}

컴파일 할 때 오류가 발생합니다.

사전 정의 된 유형 'System.ValueTuple´2'가 정의되지 않았거나 가져 오지 않았습니다.

블로그 게시물 에 따르면 이 기능은 기본적으로 "설정"되어 있어야합니다.

내가 뭘 잘못 했어?


3
2017 RTM 타겟팅 4.6.2에서도 NuGet 패키지가 필요한지 아는 사람이 있습니까? 여전히 필요한 것 같고 최종 버전이 아닐 것으로 예상했습니다.
dmeglio

대신 System.Tuple <int, int>를 사용해보십시오.
Kevin Xiao

나 에게이 stackoverflow.com/a/46533630/4383425 가 해결책이었습니다.
Andre

답변:


528

.NET 4.6.2 이하, .NET Core 1.x 및 .NET Standard 1.x의 경우 NuGet 패키지를 설치해야합니다 System.ValueTuple.

Install-Package "System.ValueTuple"

또는 VS 2017에서 패키지 참조 사용 :

<PackageReference Include="System.ValueTuple" Version="4.4.0" />

.NET Framework 4.7, .NET Core 2.0 및 .NET Standard 2.0에는 이러한 유형이 포함됩니다.


3
감사. 4.6.2에서 작동한다는 의미입니까? 디버거는 여전히 x.Item1 x.Item2를 보여줍니다. (xx 및 xy) 대신 변경되는지 알고 있습니까?
gsharp

2
설치 패키지 "System.ValueTuple"-IncludePrerelease
Frison Alexander

14
글쎄, 그것은 4.6.2에없는 것 같습니다.
binki

12
4.6.2에서 작동하지만 여전히이 패키지가 필요합니다.
엘리자베스

8
.NET 4.7에서는 패키지가 기본적으로 포함되어 있습니다.
Mafii

40

의 일부입니다 .NET Framework 4.7.

위의 프레임 워크 이상 (또는 .NET Core 2.0/ .NET Standard 2.0)을 타겟팅하지 않는 한 참조해야합니다 ValueTuple. 이 작업을 추가하여System.ValueTuple NuGet Package


1
방금 .net 4.7로 시도했지만 작동하지 않습니까? System.ValueTuple`2찾을 수 없음
Bidou

.net Framework 4.7과 Visual Studio 대상 팩을 설치했습니다. 드롭 다운에서 버전 4.7을 선택했지만 여전히 컴파일되지 않습니다.
Bidou

10
방금 문제를 발견했습니다 : dll System.ValueTuple이 프로젝트 파일 (csproj)에 하드 코드되었습니다. 프로젝트 파일에서이 항목을 제거하면 문제가 해결되었습니다.
Bidou

좋은 해결책이지만 자세한 내용을 추가 할 수 있습니다. 제 경우에는 System.ValueTuple.dll이 여전히 bin 폴더에 연결되어있었습니다. 일단 삭제하면 나아갔습니다. 내 언어 버전 default이 작동하고 있습니다.
toddmo


5

들어 비주얼 스튜디오 코드 에 내장 된 사용 터미널 및 실행 :

dotnet add package "System.ValueTuple"

dotnet restore나중에 달리는 것을 잊지 마십시오 .


VS 코드 에서이 작업을 수행 할 수 없었습니다.
JonathanPeel

10
주 : 마 닷넷 4.7이 작업을 수행하지
toddmo


3

다른 사람들이 같은 문제를 겪고 있다면 프로젝트를 4.7로 업데이트 한 후이 오류가 발생했습니다. 이상하게 도이 오류가 사라지려면 System.ValueTuple 참조를 제거해야했습니다.


3

ValueTuple.net Framework 프로젝트에 패키지 참조로 추가하는 것은 좋지 않습니다 . 아시다시피이 어셈블리는 4.7 .NET Framework에서 사용할 수 있습니다.

프로젝트가 ValueTuple패키지 폴더 대신 .NET Framework 폴더의 모든 비용을 포함하려고 할 때 특정 어셈블리가 발견되지 않는 오류가 발생할 수 있습니다.

우리는 오늘 회사에서이 문제를 겪었습니다. 우리는 2 개의 프로젝트로 솔루션을 가지고있었습니다 (나는 그것을 단순화했습니다).

  • Lib
  • Web

LibValueTuple을 포함하고을 사용하고 Web있었습니다 Lib. 그것은 알 수없는 이유에 의해 밝혀졌다 Web에 해결 경로로 시도 할 때 ValueTuple가졌다 HintPath.NET 프레임 워크 디렉토리에 잘못된 버전을 복용했다. 그로 인해 애플리케이션이 충돌했습니다. ValueTuple에 정의되지 않은 .csprojWebHintPath그 조립. 문제는 매우 이상했다. 일반적으로 패키지 폴더에서 어셈블리를 복사합니다. 이번은 정상이 아니었다.

나를 위해 항상 System.*패키지 참조 를 추가하는 것은 위험합니다 . 그들은 종종 시한 폭탄과 같습니다. 그들은 처음에는 괜찮으며 최악의 순간에 당신의 얼굴에서 폭발 할 수 있습니다. 내 규칙 : .NET Framework에System.* Nuget 패키지를 사용하지 마십시오 실제로 필요하지 않은 경우 .

프로젝트 내의 파일에 수동 ValueTuple으로 추가하여 문제를 해결 했습니다..csprojWeb


1

.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의 참조 어셈블리에서 형식을 찾을 수 없으므로 컴파일에 실패했습니다.

( https://stackoverflow.com/a/57777123/128709 중복 )


0

System.ValueTuple.dll 파일이 소스 제어하에 있는지 확인하고 .cssproj 파일에서 해당 참조를 수정해야했습니다.

  1. 솔루션의 각 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  2. 프로젝트를 내리다
  3. .cssproj 파일 편집 : 변경

<참조 Include = "System.ValueTuple">

<힌트 패스>

.... \ ProjectName \ ProjectName \ obj \ Release \ Package \ PackageTmp \ bin \ System.ValueTuple.dll

</ 힌트 경로>

</ 참조>

으로

<참조 Include = "System.ValueTuple">

<힌트 패스>

.. \ packages \ System.ValueTuple.4.4.0 \ lib \ netstandard1.0 \ System.ValueTuple.dll

</ 힌트 경로>

</ 참조>

  1. 변경 사항 저장 및 프로젝트 다시로드
  2. System.ValueTuple.dll을 찾아이 폴더에 저장하십시오.
  3. 이 파일의 참조를 소스 컨트롤에 추가

(선택 사항) : 7. 다른 .dll 파일과 동일한 문제를이 방법으로 해결


1
고정 파일 경로 (또는 모든 문자열)를 하드 코딩하는 것은 좋은 해결책이 아닙니다.
Arghya C

0

Framework 4.5.2를 대상으로하는 이전 프로젝트 중 하나에서도 이와 동일한 문제가 발생했습니다. 위에 나열된 모든 시나리오를 포함하여 여러 시나리오를 시도했습니다 .target 4.6.1, System.ValueTuple 패키지 추가, bin, obj 및 .vs 폴더 삭제. 주사위가 없습니다. 4.7.2에 대해 동일한 프로세스를 반복하십시오. 그런 다음 한 의견자가 제안한대로 4.7.2를 대상으로했기 때문에 System.ValueTuple 패키지를 제거하려고했습니다. 여전히 아무것도 없습니다. csproj 파일 참조 경로를 확인했습니다. 옳아 보인다. 심지어 4.5.2로 내려 가서 패키지를 다시 설치했습니다. 여러 VS를 다시 시작하고 동일한 폴더를 여러 번 삭제하면이 모든 것이 가능합니다. 말 그대로 아무것도 효과가 없었습니다.

대신 구조체를 사용하기 위해 리팩터링해야했습니다. 앞으로도 다른 사람들이 계속해서이 문제에 부딪치지 않기를 희망하지만 우리가 그랬던 것처럼 결국에는 이것이 도움이 될 것이라고 생각했습니다.

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