2017-09-16 7 views
2

현재 C# 7 (버전 15.3.4)의 코드는 컴파일하는 데 유효하지만 두 변수는 모두 합법적으로 사용할 수 없습니다.패턴 매칭에서 fall through

switch(fruit) 
{ 
    case Apple apple: 
    case Orange orange: 
    // impossible to use apple or orange 
    break; 
    case Banana banana: 
    break; 
} 

사용하려고하면 익숙한 오류가 발생합니다. 액세스하기 전에 변수가 초기화되지 않았을 수 있습니다.

패턴 매칭에서 어떤 유형은 원하는 유형에 속하는 한 정확한 유형은 상관하지 않습니다. 예를 들어 사과와 오렌지 만 있습니다.

List<Fruit> applesAndOranges = new List<Fruit>(); 
switch(fruit) 
{ 
    case Fruit X when X is Apple || X is Orange: 
    applesAndOranges.Add(X); 
    break; 
    case Banana banana: 
    break; 
} 

더 좋은 방법이 있습니까?

답변

4

현재 지역에서 가비지 로컬 변수를 만들고 싶지 않은 경우 버리기를 사용할 수 있습니다. 전환 된 변수를 직접 사용할 수 있습니다. 전환 된 변수가 객체 또는 다른 것과 같은 수퍼 클래스 인 경우 추가 캐스트가 필요할 수 있습니다.

List<Fruit> applesAndOranges = new List<Fruit>(); 
switch(fruit) 
{ 
    case Apple _: 
    case Orange _: 
    applesAndOranges.Add(fruit); 
    break; 
    case Banana banana: 
    break; 
} 

패턴 일치가 어떻게 컴파일되는지 모르겠습니다. 점프 테이블을 사용한다면이 접근법은 조금 더 빠를 수도 있습니다. 성능은 내 관심사가 아닙니다. 이것은 더 읽기 쉽습니다.

저는 이미이 두 가지 솔루션에 만족합니다. Q & 공유하고 싶은 게시물입니다.