2010-12-02 7 views

답변

11

아니요, 죄송합니다. C#에서 지원하는 기능이 아닌 일반 필드 또는 일반 속성이 필요합니다. 당신이 할 수있는 최선 T 소개하는 일반적인 방법을 만들 수 있습니다 :

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

을 그리고 지금은 말할 수있다 :

Func<IList<int>, int> selectInts = SelectionMethod<int>(); 
5
당신이 할 수 물론

하지만 T 알아야합니다

public Func<IList<T>, T> SelectionMethod<T>() 
{ 
    return list => list.First(); 
} 
: 당신이 일반적인 포함하는 클래스를 만들고 싶어하지 않는 경우가 일반적인 방법을 사용할 수있는 대안으로

class Foo<T> 
{ 
    public Func<IList<T>, T> SelectionMethod = list => list.First(); 
} 

하지만 여전히 컴파일 시간에 누군가가 T을 알아야합니다.

+0

예. 문제가 있습니다. 나는 T가 뭔지 모르겠다. char 또는 string이 될 수 있습니다. – mpen

+0

그러면 Foo 클래스의 소비자 (인스턴스를 생성하는 소비자)가 그것을 알 수 있기를 바랍니다. 컴파일 시간에 그것을 모를 경우 generics는 당신에게 적합한 유물이 아닙니다. –

+2

그러면 메소드 또는 클래스가 일반 매개 변수 'T'를 가져야합니다. – cdhowie

1

리턴 유형 만 일반으로 선언했습니다.

이 시도 :

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

당신이 일반적인 수의 유형 매개 변수를 포함해야 선언하는 일이의 이름입니다. 컴파일러는 제네릭 클래스 및 제네릭 메서드 만 지원합니다.

그래서, 일반적인 클래스는 방법

를 들어,

class MyGeneric<T> { 
    // You can use T here now 
    public T MyField; 
} 

이 있거나 있어야

public T MyGenericMethod<T>(/* Parameters */) { return T; } 
이 처음 메소드 이름에 선언 된 경우에만 당신은 반환 매개 변수로 T를 사용할 수 있습니다

.

반환 형식이 실제 메서드보다 먼저 선언 된 것처럼 보이지만 컴파일러는 그런 식으로 읽지 않습니다.

+0

어? 아니, 나는 편집하기 전에. 그게 무슨 상관이 있죠? – mpen

+0

더 나은 설명입니다. 그래도 나는 일반적인 람다를 원했고, 그것이 존재하지 않는다고 생각합니다. – mpen

0
public static void SomeContainerFunction() 
    { 
     const string NULL_VALUE = (string)null; 

     Type GetValueType<T>(T value) => value?.GetType() ?? typeof(T); 

     var typeOfNullValue = GetValueType(NULL_VALUE); 

     Debug.WriteLine($"Value: {NULL_VALUE}, Type: {typeOfNullValue}"); 
    } 
+1

안녕하세요. 질문에 대답 할 때 코드와 관련된 설명을 제공하십시오. 어떤 사람들은 자신의 코드를 이해하지 못하거나 질문에 어떻게 대답 하는지를 보지 못합니다. [좋은 답변 작성 방법] (https://stackoverflow.com/help/how-to-answer)을 참조하십시오. – Nuageux

관련 문제