Lambda表达式c#转换为对象类型失败,使用ref失败



具有如下功能:

   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);}
        );
    }
}

相关内容

  • 没有找到相关文章

最新更新