2017-12-26 7 views
-2

object 객체를 가지고 있는데, GetType()을 호출하면 HashSet<Availability> 유형을 반환하지만 반환합니다. 다른 경우에 HashSet<Contact>의 비 관련 유형 또는 아직 알려지지 않은 임의의 수인 HashSet<...> 유형. 다운 캐스팅 객체에 컬렉션의 제네릭 형식하면 코드가 된 직후 알 필요가 없도록하면서C#에서는 객체 유형을 일반 "객체"컬렉션 유형으로 상속 할 수 있습니까?

object myObject = getMyObject(); 
myObject.GetType() // = HashSet<Availability> 

나는 (HashSet의 또는 다른) 어떤 종류의 컬렉션에 개체를 캐스팅하고 싶습니다 아직 컴파일 타임에 알 수없는 유형.

object myObject = getMyObject(); 
myObject.GetType() // = HashSet<Availability> 
var myUsefulObject = (HashSet<object>)myObject; 

"시도 할 수 없습니다 ..."예외가 발생했습니다.

이것이 가능합니까? 그렇다면 어떻게?

나는 내가 가지고있는 HashSet의 유형과 내가 원하는 일 사이의 공분산을 생각하지만, 내 초기 타입은 객체이기 때문에 나는 this stack-overflow answer suggests 무엇을 드릴 수 없습니다.

+3

* 가능합니까? * - 아니요. 이것은 모두 꿈입니다. 컴파일러는 실제로 당신에게 공분산에 대한 당신의 믿음이 틀렸다고 말하지 않고, 당신이하고있는 일이 근본적으로 당신이 링크 한 대답과 근본적으로 다르다는 것을 부인합니다. –

+1

보세요,'HashSet '를'HashSet '으로 캐스팅 할 수 있다고 가정하십시오. 그런 다음 이렇게 할 수 있습니다.'(새로운 HashSet ()를 HashSet 으로) .Add ("LOL")'. 그게 너에게 좋은 생각 인거야? –

+0

또한, 왜 * 왜 * 이것을하고 싶습니까? 최종 목표는 무엇입니까? –

답변

0

귀하의 질문에 대한 긴 의견 사슬이 표시된 것처럼 HashSet<Availability>HashSet<object>으로 변환 할 수 없습니다. 두 가지 유형간에 암시 적 \ 명시 적 \ 기타 변환이 ​​정의되어 있지 않기 때문입니다. 그러나 HashSet<T>IReadOnlyCollection<T>IEnumerable<T> 같은 여러 공변 인터페이스를 구현하고, 당신은 (object의) 이러한 인터페이스에 HashSet<Availability> 전송할 수 있습니다 : 유형 T 인터페이스에 공변 인 경우

object myObject = getMyObject(); 
var myUsefulObject = (IReadOnlyCollection<object>)myObject; 

-이 유형의 인수로 사용할 수 없습니다 해당 인터페이스의 모든 메소드이며 리턴 유형으로 만 사용할 수 있습니다. 즉,이 경우 유형 안전을 손상시킬 수있는 모든 메소드 (예 : Add(T item), Remove(T item) 등)는 이러한 인터페이스에 존재할 수 없으므로 Availabilityobject으로 반환하는 것은 문제가되지 않습니다.

관련 문제