我有一个带有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参数传递”
有办法解决这个问题吗?
答案 0 :(得分:1)
参数offset
未指定类型。尝试将BreakLine
方法签名更改为:
string BreakLine(string text, int lineLimit, ref int offset);
...但我想这只是你问题中的一个错字。你遇到的真正的问题是你得到编译器错误CS1939。从文档中引用:
范围变量是只读的 查询中引入的变量 表达式并用作标识符 对于a中的每个连续元素 源序列。因为它不可能 以任何方式修改,没有任何意义 通过
ref
或out
传递。 因此,两种操作都不是 有效的。
答案 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);