我想知道这段代码是怎么工作的:
dynamic dynaString = 2;
string b = dynaString.ToString();
当这个不起作用时:
var list = new List<dynamic>();
var liststring = new List<string>();
liststring = list.Select(x => x.ToString()).ToList();
我知道在Select语句之后可以添加Cast<string>,但这并不能解释这种行为。为什么对动态元素调用ToString()时,与在代码中声明的动态变量上调用时不同于从LINQ列表中获取的动态变量上调用时不同。
我查看了Select方法的签名,它是: 我的猜测是这里的
x
是一个动态变量,所以它应该像dynaString
一样运行,但实际上并不是。Intellisense建议我x.ToString()
返回string
:
有没有人在C#中有动态方面的经验,可以向我解释一下?
我也尝试了这段代码:
var list = new List<dynamic>();
var liststring = new List<string>();
foreach (dynamic a in list)
{
liststring.Add(a.ToString());
}
这段代码如预期一样编译通过,因为在foreach语句中,a
被声明为动态类型。
aDynamic.ToString()
的返回类型是动态的,因此Select<dynamic, dynamic>
被推断出来... 你不会期望将List<dynamic>
分配给List<string>
。如果你改为指定Select<dynamic, string>
,那应该就可以了。 - steve16351<dynamic,string>
而是选择<dynami,dynamic>
呢?我尝试过liststring = list.Select<dynamic,string>(x => x.ToString()).ToList();
,它像你说的那样编译通过了 :) - Kamil Budziewski