2010-08-12 3 views
9

나는 C#을 일부 자바 코드를 포팅하고있는 형식화되지 않은 컬렉션을 가질 수와 나는이 가로 질러 :나는 C#을

List<?> 

내가이 유형 UnknownList 이해한다. 결과적으로 다른 곳에서 유형을 지정할 수 있습니다 (런타임에는 확실하지 않습니다).

C#의 기본 기능은 무엇입니까?

+1

질문입니다. 이게 정말 좋은 생각입니까, 아니면 유형 안전성을 더 잘 보시겠습니까? –

+5

목록 은 관련 답변이 아닙니다. 메서드가 List 매개 변수를 허용하면 List , List 과 같은 모든 List 유형을 허용 할 수 있습니다. 매개 변수가 List 이면 작동하지 않습니다. – irreputable

+0

일부 컨텍스트를 갖는 것이 좋을 것입니다 ...이 선언에 대해 어디에서 사용하고 있습니까? –

답변

6

List<Foo> 내가 당신보다 List<?>을 취하는 방법이있는 경우 자바의 List<?>에 가장 일치하는 C# 4.0 IEnumerable<out T>있을 거라고 생각, 작동하지 않습니다

List<Object> objList = new List<Object>(); 
List<String> strList = new List<String>(); 

doSomething(objList); //OK 
doSomething(strList); //OK 

public void doSomething(List<?> theList) { 
///Iterate through list 
} 

C# 4.0 IEnumerable<T> 인터페이스는 실제로입니다 :과 같이 List<String>List<Object>로 호출 할 수 있습니다입니다. 즉, RT에서 파생 된 경우 IEnumerable<R>IEnumerable<T>을 할당 할 수 있습니다.

List<Object> objList = new List<Object>(); 
List<String> strList = new List<String>(); 

DoSomething(objList); //OK 
DoSomething(strList); //OK 

public void DoSomething<T>(IEnumerable<T> theList) { 
///Iterate through list 
} 

편집 : C# 4.0을 사용할 수없는 경우, 당신은 항상 두 유형이 지정되지 않은 IEnumerable로 다시 떨어질 수

그래서, 당신이 할 일은 당신의 doSomethingDoSomething로하고 IEnumerable<T> 매개 변수를 받아 가지고있다 또는 IList.

+0

C# 4.0은 declaration-site variance를 사용하는 반면 Java는 use-site입니다. 사용 사이트는 "읽기 - 쓰기"인터페이스가 공통적 인 곳에서 더 의미가 있습니다. –

5

무엇이든 저장할 수있는 목록을 원할 경우 List<object> 또는 ArrayList을 사용할 수 있습니다.

알 수없는 형식을 포함하는 강력한 형식의 목록을 원할 경우 일반 클래스 또는 메서드를 만들고 List<T>을 사용해야합니다.

자세한 내용은 더 자세히 알려주십시오.

+0

목록 은 (는) 알 수없는 유형이 아닙니다. 그것은 T 형입니다. 자바에서 뭔가 다른 것입니다. – serg10

+0

@Serg : 그래서 내가 ** ** **라고 말한 이유입니다. – SLaks

0

당신은 단지

List<object>

+1

이것은 작동하지 않습니다. '목록 '여전히 C# 4이 시나리오에서 –

0

를 사용할 수 있습니다 나는 질문자가 C#을 등가로이

int size2(List<?> list) 
{ 
    return 2*list.size(); 
} 

List<Foo> list = ... 
size2(list); 

같은 것을 변환하고 싶은 생각합니다. 그것은 단지 List<Object>을 받아 들일 때문에

다음 코드는하지

int size2(List<Object> list) 
{ 
    return 2*list.size(); 
} 
+0

(전용 인터페이스와 명 규모)를 지원하지 않습니다 contravariance의 구현, 자바의'목록 '에 해당되지 않습니다 일 것입니다 : INT의 SIZE2을 (리스트 리스트) { return 2 * list.Count; } –

1

IList은 (는) 찾고있는 소리입니다. 이는 목록에 대한 일반적인 인터페이스입니다. 즉, 나오는 내용을 캐스팅해야하고 입력 한 내용을 조심해야합니다.

3

첫 번째로 무한 와일드 카드 매개 변수화 된 유형은 오브젝트와 다릅니다. 제네릭은 공 변하지 않습니다. 그래서 OP의 Java 예제에서 List<?>List<Object>과 같지 않습니다.기존 비 제네릭 컬렉션과 상호 작용할 때 예를 들어, 자바 List<?>에 대한

// Unbounded wildcard type is not the same as Object... 
List<?> unboundedList = new ArrayList<Object>(); 
List<Object> objectList = new ArrayList<Object>(); 
unboundedList = objectList; // no problems 
objectList = unboundedList; // whoops! compile time error 

유일한 사용 사례입니다. 컴파일러에서 unchecked conversion 경고를 피할 수 있습니다.

C#에는이 사용 사례가 없습니다. C# 제네릭은 지우개를 사용하여 구현되지 않았습니다. .net의 일반 콜렉션과 비 제네릭 콜렉션 간에는 하위 호환성이 없습니다. 코어 .net 라이브러리에 공존합니다. 이는 collection api의 generic 버전이 JDK 1.5의 비 generic 버전을 대체 한 Java와는 다릅니다.

그래서 C#에이 구조를 사용하려는 이유가 없다고 생각합니다. 동일한 방식으로 동작하는 직접적인 동일한 기능은 없습니다.