2010-09-06 6 views
0

J'ai une fonction qui prend un paramètre ref et que j'aimerais utiliser dans une requête linq mais le compilateur se plaint.Utilisation de paramètres ref dans linq

La fonction est appelée rabattement et casse une chaîne vers le haut dans les lignes à partir d'une longueur de ligne, le paramètre ref est utilisé pour garder une trace de l'endroit où il est dans la chaîne sur chaque appel:

string BreakLine(string text, int lineLimit, ref offset); 

La requête est:

from pt in productText 
let offset = 0 
from ll in lineLimits 
select new Line() { Text = BreakLine(pt, ll, ref offset) } 

(Line est une simple classe de données)

L'erreur est:

"Impossible de transmettre la variable de plage 'offset' comme paramètre out ou ref"

Une solution pour contourner ce problème?

Répondre

1
Func<string, int, Line> lineFunc = (pt, ll) => 
{ 
    int offset = 0; 
    return new Line() { Text = BreakLine(pt, ll, ref offset) }; 
}; 
var test = from pt in productText 
      from ll in lineLimits 
      select lineFunc(pt, ll); 
1

Le paramètre offset n'a aucun type spécifié. Essayez de changer la signature de la méthode BreakLine dans ce:

string BreakLine(string text, int lineLimit, ref int offset); 

... mais je suppose que c'est juste une faute de frappe dans votre question. Le problème réel que vous avez est que vous obtenez l'erreur de compilation CS1939. Citation de la documentation:

Une variable de portée est une variable de lecture seule qui est introduit dans une expression de requête et sert d'identificateur pour chaque élément successif d'une séquence source . Parce qu'il ne peut pas être modifié de quelque façon, il n'y a aucun point en passant par ref ou out. Par conséquent, les deux opérations ne sont pas valides.

+0

je quittais le type du paramètre par erreur, est en fait que vous l'avez. Suppression du mot-clé ref donne juste une autre erreur car elle ne correspond pas à la signature de la méthode. – user380689

Questions connexes