2017-12-17 34 views
3

나는이 줄을 쓸 때 :C# 7.0 튜플 공제

Severity Code Description Project File Line Suppression State Error CS0029 Cannot implicitly convert type '(string controller, string action)' to 'System.Tuple' Project.Web PageMetadata.cs 27 Active

이이 새로운 튜플 향상의 매우 솔직하고 직관적 인 응용 프로그램처럼 보인다 :

Tuple<string,string> key = (controller, action); 

내가이 오류를 C# 7 업데이트의 중심에 있지만 아직 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

5

새로운 튜플 기능은 ValueTuple 유형을 필요로 즉

ValueTuple<string, string> key = (controller, action); 

또는

var key = (controller, action); 

그것은 Tuple 클래스이며, ValueTuple이 구조체는 것을주의하는 것이 중요합니다. 당신은 그들을 섞어서는 안됩니다. C# 7의 새 튜플 기능에 대한 자세한 내용은 here을 참조하십시오.

0

Tuple<string, string> 대신 ValueTuple<string, string>을 사용하십시오. Tuple<T1,T2>은 C# 7.0 이전의 시스템 유형입니다. ValueTuple<T1,T2>은 새로운 언어 기능을 지원하는 언어입니다. 자세한 내용은 the C# Tuple type guide을 참조하십시오. 작은 arities에 대해 정의 ToTupleToValueTuple :

0

당신이 정말로 (튜플 구문에서 사용) System.ValueTupleSystem.Tuple에서 변환해야하는 경우, 또는 다시는 확장 방법이있다.

2

우선 새 스타일 튜플 (ValueTuple)을 이전 스타일 튜플 (Tuple)으로 캐스팅하려고 할 때 오류가 발생합니다.

ToTuple() 확장 방법을 사용하여 달성 될 수있다 :

Tuple<string,string> key = (controller, action).ToTuple();   

그러나 그것은 아마 당신이 뭘 하려는지 없습니다.

ValueTuple<string,string> key = (controller, action); 

을하지만 그렇게 할 경우, 당신은 여전히 ​​주요 기능 중 하나를 패배 Item1Item2을 호출되는 두 가지 요소로 끝낼 : 새로운 튜플의 인스턴스를 만들려면, 당신은 할 수 새로운 튜플 구문의 : 명명 된 요소. var를 사용하도록 변경, 당신은 그 다음이라는 요소를 얻을 : 당신이 정말로 당신은 여전히 ​​그 이름 요소를 얻기 위해 긴 형식을 표현할 수 있습니다 (일부 사람들이하지 않는) var를 사용하여 마음에 들지 않으면

var key = (controller, action); 
Console.WriteLine(key.controller); // key.controller is now valid 

을 :

(string controller, string action) key = (controller, action); 
Console.WriteLine(key.controller);