为什么此lambda表达式需要将字符串强制转换为字符串?

时间:2019-06-12 21:03:24

标签: c# dynamic lambda

考虑此方法,该方法将动态对象作为输入参数,然后通过从'someProperty'属性中剥离非数字字符来创建字符串。

public static void Foo(dynamic obj)
{
   string one = Convert.ToString(obj.someProperty);
   string two = new string(one.Where(ch => Char.IsDigit(ch)).ToArray());
}

它将编译并按预期运行。

现在考虑将操作压缩为一行的相同方法:

public static void Foo(dynamic obj)
{
   string three 
       = new string(Convert.ToString(obj.someProperty)
         .Where(ch => Char.IsDigit(ch)).ToArray());
}

这不会编译,它会引发错误:

  

错误CS1977无法将lambda表达式用作动态调度的操作的参数,除非先将其转换为委托或表达式树类型。

但是,如果我将Convert.ToString部分转换为字符串,则可以正常工作!

string three 
  = new string(((string)Convert.ToString(obj.someProperty))
    .Where(ch => Char.IsDigit(ch)).ToArray());

为什么需要这种强制转换? Linq为什么不知道Convert.ToString的返回值是一个字符串?

0 个答案:

没有答案