2014-01-27 1 views
1

케빈 헤니 (Kevlin Henney)의 논문 Valued Conversions은 소위 변형 값 유형 기능에 대한 동기와 C++ 구현의 개요를 제공합니다. 그것은 좋은 읽기이며 정확히 내가 C#에서 사용할 수있는 싶습니다 : 다른 value-types의 값을 저장할 수있는 일반적인 유형을 다루고 있습니다.변형 값 유형을 만들 수 있습니까?

C#에서 이와 비슷한 것을 찾을 수 없었습니다. 그래서 비슷한 질문은 "이것은 아마도 당신이 원하는 것이 아닙니다"와 같은 불만족스러운 대답과 의견을 가지고 있습니다. 이것은 일반적으로 필요한 기능처럼 보였기 때문에 저를 놀라게합니다. Henney의 C++ boost::any 클래스가 널리 사용됩니다.

C#에서이 기능을 만들 수 있습니까?


편집 : 답변 중 하나에 대한 응답으로 제네릭이 그 트릭을 수행 할 것이라고 생각하지 않습니다. 제네릭을 사용하려면 개발자가 Variant 변수가 보유하고있는 값 유형의 종류를 알고 있어야하며 그 유형은 특정 Variant 변수에 대해 불변이됩니다. 하지만 제가 말하는 Variant 유형은 다른 유형을 보유 할 수 있어야합니다. 예를 들어, 함수 Variant ReadValue()은 파일에서 항목을 읽고 구문 분석하고 그에 따라 Variant 값을 채운 다음 반환 할 수 있습니다. 발신자는 반환 된 Variant에 어떤 종류의 유형이 포함될 지 미리 알지 못합니다.

+2

'Object' 유형으로 선언하는 것은 어떨까요? – bhamlin

+0

@bhamlin'Object'를 사용하는 것이 적절할까요? 나는 C#을 처음 접했기 때문에 잘 모르겠습니다. 그 접근 방식은 너무 좋아요. 왜냐하면'Object'는 기본적으로 값이 아닌 타입을 포함해서 아무것도 될 수 없기 때문입니다. –

답변

4

이것은 제네릭이 사용하는 것입니다. List<T> 여기서 T은 전혀 없습니다. Generics는 컴파일 타임 및 런타임 유형 안전을 제공합니다.

원하는 모든 값을 저장하기 위해 고유 한 제네릭 형식을 만들 수 있습니다. 너는 object에 무엇이든을 던지기 같이 그것을 주변에 통과 할 수 있었다.

public MyClass<T> where T : class 

또는 값 형식 :

public MyClass<T> where T : struct 

더 여기 참조 또한 참조 형식이 될 만 T이 등을 원하는대로, 당신의 유형을 제한하는 일반적인 제약 조건을 사용할 수 있습니다

: http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

제네릭 형식을 'ValueType'으로 제한 할 수 없습니다. – Servy

+0

@Servy : '구조체'가 아닌 'ValueType'을 의미합니다. – Magus

+0

Thanks @Servy and @Magus - 내 오류를 바로 잡고 잊어 버렸습니다. 나는 항상 new()를 통해 참조 타입으로 제한 할 수 있기 때문에 * 할 수 있다고 생각한다. – Haney

1

이 경우에도 dynamic을 사용할 수 있습니다.

동적 유형은 컴파일 타임 유형 검사를 우회하기 위해 발생하는 조작을 가능하게합니다. 대신 이러한 작업은 런타임에 해결됩니다.

동적 유형은 대부분의 경우 유형 객체와 유사하게 동작합니다. 그러나 동적 유형의 표현식이 포함 된 작업은 컴파일러에서 확인하거나 유형을 확인하지 않습니다.

0

헤니의 기사는 꽤 오래되었습니다 (2000 년). 라이브 레슨 (London DevWeek 2008)에서 그는 OCP (Open-Closed Principle)에 대한 추상화 (인터페이스)에 대한 낮은 결합과 구현에 대해 설명했습니다. 그는 제네릭과 제네릭 인터페이스를 꽤 좋아했습니다. 그래서 개념적으로 아마 일 것입니다. 그 기사를 읽지 않았다는 것을 인정해야 하겠지만, 그가 그 당시에 대해 쓴 내용은 아마도 그렇습니다. C# generics는 C++ 템플릿보다 조금 더 강력합니다. Covariance and Contravariance in Generics을 봐야합니다.다른 주에

:

제네릭 ++ C 및 C 사용할 수 있었다있는 variable arity templates입니다 당신이 할 수있는 일. ++ 나 C에 any을 사용하여 이해하는 것과

0

은에서와 모든 유형에 autoconversion에 대한 좋은 구문을 갖는 제외하고 C#으로 objectChangeType 방법의 조합을 사용하는 것과 동일합니다. 그리고 값 유형에만 제한이 없습니다.

관련 문제