문제

Java에서는 다음과 같이 "알 수 없는" 일반 유형으로 매개변수화된 변수를 선언할 수 있습니다.

Foo<?> x;

C#에 이 물음표에 해당하는 구문이 있나요?

도움이 되었습니까?

해결책

짧은 대답은 '아니요'입니다.C#에는 이에 상응하는 기능이 없습니다.

해결 방법은 다음과 같습니다. Java 개발자의 관점에서 본 C# 작성자: Dare Obasanjo

어떤 경우에는 특정 유형을 포함하는 데이터 구조가 아닌 모든 유형을 포함하는 데이터 구조에서 작동할 수 있는 메서드를 만들어야 할 수도 있습니다(예:데이터 구조의 모든 객체를 인쇄하는 방법) 제네릭의 강력한 유형 지정의 이점을 계속 활용합니다.C#에서는 이를 지정하는 메커니즘이 일반 유형 추론이라는 기능을 통해 이루어지지만 Java에서는 와일드카드 유형을 사용하여 수행됩니다.다음 코드 샘플은 두 접근 방식이 어떻게 동일한 결과를 가져오는지 보여줍니다.

C# 코드

using System;
using System.Collections;
using System.Collections.Generic; 

class Test{

    //Prints the contents of any generic Stack by 
    //using generic type inference 
    public static void PrintStackContents<T>(Stack<T> s){
        while(s.Count != 0){
            Console.WriteLine(s.Pop()); 
        } 
    }

    public static void Main(String[] args){

    Stack<int> s2 = new Stack<int>(); 
    s2.Push(4); 
    s2.Push(5); 
    s2.Push(6); 

    PrintStackContents(s2);     

    Stack<string> s1 = new Stack<string>(); 
    s1.Push("One"); 
    s1.Push("Two"); 
    s1.Push("Three"); 

    PrintStackContents(s1); 
    }
}

자바 코드

import java.util.*; 

class Test{

    //Prints the contents of any generic Stack by 
    //specifying wildcard type 
    public static void PrintStackContents(Stack<?> s){
        while(!s.empty()){
            System.out.println(s.pop()); 
        }
    }

    public static void main(String[] args){

    Stack <Integer> s2 = new Stack <Integer>(); 
    s2.push(4); 
    s2.push(5); 
    s2.push(6); 

    PrintStackContents(s2);     

    Stack<String> s1 = new Stack<String>(); 
    s1.push("One"); 
    s1.push("Two"); 
    s1.push("Three");   

    PrintStackContents(s1); 
    }
}

다른 팁

AFAIK C#에서는 그렇게 할 수 없습니다.BCL이 수행하는 작업과 많은 예제는 일반 클래스가 아닌 클래스를 만든 다음 이전 클래스의 기본 동작을 상속하는 일반 클래스를 만드는 것입니다.아래 예를 참조하세요.

class Foo
{
}

class Foo<T> : Foo
{
}

다음과 같이 작성할 수 있습니다.

Foo t = new Foo<int>();

분명히 깨끗한 접근 방식은 아니지만 Foo<object> x 적합할 수도 있습니다.

C#에는 동등한 구문이 없습니다.

C#에 이에 상응하는 기능이 없다는 것은 사실이 아닙니다.유형으로 사용하거나 메소드를 호출할 수 있는 정적 등가물은 없습니다.이를 위해 다음을 사용하십시오. 호르헤의 대답.

반면에 때로는 성찰을 위해 동등한 아이디어가 필요하며 거기에 동등한 것이 있습니다.당신이 가지고 있다면:

interface IFoo<T>
{
  T Bar(T t, int n);
}

당신은 얻을 수 있습니다 Type 이는 IFoo<int> 사용하여 typeof(IFoo<int>).덜 잘 알려져 있고 귀하의 질문에 대한 부분적인 대답은 다음과 같습니다. Type 이는 IFoo<T> 사용하여 typeof(IFoo<>).

사용하고 싶을 때 유용합니다. IFoo<T> 일부 T 반사를 통해 알 수 없습니다 T 런타임까지.

Type theInterface = typeof(IFoo<>);
Type theSpecificInterface = theInterface.MakeGenericType(typeof(string));

// theSpecificInterface now holds IFoo<string> even though we may not have known we wanted to use string until runtime

// proceed with reflection as normal, make late bound calls / constructions, emit DynamicMethod code, etc.

아니요, C#에는 실제로 동일한 개념이 없습니다.Foo의 기본 클래스(제네릭이 아닌 Foo일 수 있음)를 참조하거나 작업 중인 메서드를 제네릭 자체로 만들어야 합니다(Foo를 참조할 수 있고 메서드 호출자가 T가 무엇인지 결정하도록 해야 함). 이다).

도움이 되길 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top