在linq中使用ref参数

时间:2010-09-06 05:11:30

标签: c# linq pass-by-reference

我有一个带有ref参数的函数,并希望在linq查询中使用它,但编译器会抱怨。

该函数被称为BreakLine,并根据行长度将字符串分成行,ref参数用于跟踪每次调用时字符串的位置:

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

查询是:

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

(Line是一个简单的数据类)

错误是:

“无法将范围变量'offset'作为out或ref参数传递”

有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

参数offset未指定类型。尝试将BreakLine方法签名更改为:

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

...但我想这只是你问题中的一个错字。你遇到的真正的问题是你得到编译器错误CS1939。从文档中引用:

  

范围变量是只读的   查询中引入的变量   表达式并用作标识符   对于a中的每个连续元素   源序列。因为它不可能   以任何方式修改,没有任何意义   通过refout传递。   因此,两种操作都不是   有效的。

答案 1 :(得分: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);