2010-12-02 31 views

Répondre

11

Non, désolé. Cela nécessiterait des champs génériques ou des propriétés génériques, qui ne sont pas des fonctionnalités supportées par C#. Le mieux que vous pouvez faire est de faire une méthode générique qui introduit T:

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

Et maintenant vous pouvez dire:

Func<IList<int>, int> selectInts = SelectionMethod<int>(); 
5

Bien sûr, vous pouvez, mais T doit être connu:

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

Comme alternative, vous pouvez utiliser une méthode générique si vous ne voulez pas faire la classe générique contenant:

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

Mais encore quelqu'un à la compilation aura besoin de savoir ceci T.

+0

Oui, c'est le problème. Je ne sais pas ce que T est. Ce pourrait être un char ou une chaîne. – mpen

+0

Eh bien alors j'espère que le consommateur (celui qui l'instancie) de la classe 'Foo ' le saura. Si vous ne le savez jamais au moment de la compilation, les génériques ne sont pas le bon artefact pour vous. –

+2

Eh bien, votre méthode ou votre classe doit prendre un paramètre générique 'T'. – cdhowie

1

Vous avez déclaré que le type de retour est générique.

Essayez ceci:

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

Le nom de la chose que vous déclarez doit inclure les paramètres de type pour qu'il soit générique. Le compilateur prend uniquement en charge les classes génériques et les méthodes génériques.

Ainsi, pour une classe générique vous devez avoir

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

Ou, pour les méthodes

public T MyGenericMethod<T>(/* Parameters */) { return T; } 

Vous pouvez utiliser T comme paramètre de retour, que si elle a été déclarée au nom de la méthode première .

Même s'il semble que le type de retour est déclaré avant la méthode actuelle, le compilateur ne le lit pas de cette façon.

+0

Eh? Non, je n'ai pas ... même avant le montage. Et qu'est-ce que cela a à voir avec quoi que ce soit? – mpen

+0

C'est une meilleure explication. Je voulais cependant un lambda générique qui, je suppose, n'existe pas. – 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

Bienvenue sur SO. Lorsque vous répondez à une question, veuillez fournir des explications associées à votre code. Certaines personnes pourraient ne pas comprendre votre code ou ne pas voir comment cela répond à la question. Voir [comment écrire une bonne réponse] (https://stackoverflow.com/help/how-to-answer) – Nuageux