具有如下功能:
private static void EncodeString(ref string str)
{
using (RLE inst_rle = new RLE())
{
string str_encoded = inst_rle.Encode(ref str);
Console.WriteLine(
"rnBase string ({0} chars): {1}rnAfter RLE-encoding ({2} chars): {3}rnCompression percentage: %{4}",
str.Length, str, str_encoded.Length, str_encoded,
() => { (100 * (str.Length - str.encoded.Length) / str.Length); }
);
}
}
我记得这是c#中的lambdas风格:()=> {<动作>;} 动作>
但是出现这样的错误:
- 无法将lambda表达式转换为'object'类型,因为它
- 只有赋值、调用、自增、自减和new对象表达式可以用作语句
- 不能在匿名方法、lambda表达式或查询表达式中使用ref或out参数'str'
- 不能在匿名方法、lambda表达式或查询表达式中使用ref或out参数'str'
如何在我的应用程序(控制台应用程序)中使用Lambda而不显式使用
Delegate/Func() => { }
一样?
我不太确定你为什么要在这里使用lambda,看起来你想:
Console.WriteLine(@"rnBase string ({0} chars): {1}rnAfter RLE-encoding
(
{2} chars): {3}rnCompression percentage: {4}",
str.Length, str, str_encoded.Length, str_encoded,
(100 / str.Length) * (str.Length / str_encoded.Length)
);
正如注释所指出的,您需要在格式字符串前面加上@
,因为它跨越了多行。
我同意Lee的观点,但是当您真的想创建这样一个Lamba并获得它的输出时,您需要显式地强制转换如下内容:
(Func<int>)(() => (100 / str.Length) * (str.Length / str_encoded.Length)))();
我这样做,当我玩线程,而不是在生产代码虽然
字符串常量可以用@
前缀在多个代码行上定义,但是您的rn
将不起作用。因此,您可以将字符串片段与+
一起添加,以达到相同的效果:
private static void EncodeString(ref string str)
{
using (RLE inst_rle = new RLE())
{
string str_encoded = inst_rle.Encode(ref str);
Console.WriteLine("rnBase string ({0} chars): {1}rnAfter RLE-encoding" +
"(" +
"{2} chars): {3}rnCompression percentage: {4}",
str.Length, str, str_encoded.Length, str_encoded,
() => { (100 / str.Length) * (str.Length / str_encoded.Length);}
);
}
}