考虑此方法,该方法将动态对象作为输入参数,然后通过从'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
的返回值是一个字符串?