2014-11-08 3 views
2

나는 차별화 된 노동 조합이 열거 형과 반드시 ​​같지 않다는 것을 알고 있습니다. 그러나 하위 사용자의 이러한 유형의 경우 :C#에서 enum 스타일의 공용체가 클래스로 취급되는 이유는 무엇입니까?

type Colors = Red | Green | Blue 

그들은 각각의 색상이 Colors 클래스의 인스턴스를 참조하는 읽기 전용 속성입니다 클래스 Colors로 처리됩니다.

열거 형에 비유 할 수있는 이러한 유형의 DU의 경우 C#에서 열거 형으로 처리되지 않는 이유는 무엇입니까?

이처럼 정의하면 당신은 F 번호에 열거를 가질 수

답변

6

: 즉, 그들은 컴파일러에 의해 인코딩하는 방법이기 때문에

type Colors = Red = 1 | Green = 2 | Blue = 3 

차별 노동 조합은 C#에서 클래스로 볼 수 있습니다 - 노동 조합 유형에 대한 클래스로 그리고 케이스들을위한 중첩 된 클래스들의 집합. 이것은 코드의 F # 클라이언트가 아닌 모든 클라이언트가 보는 것입니다. 이는 불행히도 F #에서 .NET 리플렉션 API를 사용하여 차별화 된 유니언에 액세스하는 시간을 포함합니다.

조합은 임의의 인수를 전달할 수있는 복잡한 사례로 인해 클래스로 표현됩니다. 이러한 조합을 인코딩하는 것은 자연스러운 방법입니다. 모든 경우에는 인수가없는 시나리오에서 컴파일러가 대신 enum을 생성 할 수 있다는 점을 알 수 있습니다. 그러나 이것은 단순한 노동 조합이 값 유형이고 복잡한 노동 조합이 참조 유형이된다는 사실에서 시작하여 노동 조합에 대한 컴파일 된 표현을 매우 미친 방법으로 이질적으로 만듭니다. 이것이 언어에 추가 할 함정의 수는 재앙이 될 것입니다!

+0

나는 이러한 DUs 열거 형 아닌 이유는 새로운 요소를 중간에 추가 할 때 동작이 이상한 방식으로 호환성을 부수 것입니다. –

+0

아이디어는 꽤 무해한 것처럼 보입니다.하지만 생각할 때, C# API를 조금 더 멋지게 만드는 것보다 열심히한다는 것 (성능 항목조차도 아님)은 없습니다. 그리고 이것은 F #에서 열거 형을 직접 선언함으로써 이미 수행 할 수 있습니다. – scrwtp

4

열거 형은 확장 가능이므로 F #으로 구분 된 공용 구조체와는 개념적으로 다릅니다.

다음은 F #의 CLI enum의 올바른 선언 및 사용법입니다.

type A = Alpha = 1 | Alice = 2 
let a = enum<A>(56) 

비슷한 DU와 비교 :

type B = Beta | Bob 
// No way to instantiate B except the above cases 

따라서, 심지어는 수의 경우, 열거로 DU를 컴파일하는 것보다 덜 엄격한으로 렌더링 결과 열거는 C 번호와 호환 DU의 예상. 예상대로, 다음과 같은 경고를 제공합니다 :

// Compiler warning: incomplete pattern matches. 
match a with A.Alpha -> '!' | A.Alice -> '?'