2010-03-17 6 views

Répondre

70

Il ne peut pas être fait par Func mais vous pouvez définir une coutume delegate pour elle:

public delegate object MethodNameDelegate(ref float y); 

Exemple d'utilisation:

public object MethodWithRefFloat(ref float y) 
{ 
    return null; 
} 

public void MethodCallThroughDelegate() 
{ 
    MethodNameDelegate myDelegate = MethodWithRefFloat; 

    float y = 0; 
    myDelegate(ref y); 
} 
+23

La raison étant: tous les arguments de type générique doivent être des objets qui sont conv susceptible d'objet. "ref float" n'est pas convertible en objet, donc vous ne pouvez pas l'utiliser comme argument de type générique. –

+1

Merci pour ça, j'avais du mal à utiliser Func alors je sais pourquoi je ne peux pas l'utiliser quand le type n'est pas convertible en objet – chugh97

+0

Est-ce que cela veut dire que la dactylographie du participant nécessitera boxing/unboxing dans ce cas? –

5

Dans .NET 4+, vous pouvez également prendre en charge ref types de cette façon ...

public delegate bool MyFuncExtension<in string, MyRefType, out Boolean>(string input, ref MyRefType refType); 
+1

Pour ne pas ressusciter un thread mort, mais il devrait certainement être noté pour toute personne qui croise cela que, alors que vous pouvez soutenir un ref param avec des génériques de cette façon, le paramètre de type générique sera invariant. Les paramètres de type générique ne prennent pas en charge la variance (covariance ou contravariance) pour les paramètres ref ou out dans C#. Toujours bien si vous n'avez pas à vous soucier des conversions de type implicites. –

+2

Désolé, cette réponse est un peu hors-piste. Le «in» et le «out» que vous montrez pour paramétrer le délégué se rapportent à la co-contre «contra-variance», et ne sont pas liés à ce que demande le PO. La question concernait les délégués qui peuvent accepter des paramètres par référence, et non l'agilité d'un délégué (générique) en ce qui concerne la paramétrisation de son type. –

Questions connexes