【发布时间】:2019-12-07 18:15:04
【问题描述】:
我想知道这段代码是如何工作的:
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());
}
它按预期编译,因为 a 在 foreach 语句中再次声明为动态。
【问题讨论】:
-
@SᴇM 按照您的建议,我找到了这个答案stackoverflow.com/a/4893408/1714342,但它仍然不能完全回答我的问题。 “只要你有一个“动态”的类型参数,编译器就会简单地生成“对象”作为类型参数。“动态”是 C# 语言的特性”这里不是这种情况。您可以将此处的所有动态更改为对象,它会编译,而动态则不会:)
-
我不确定它是否能回答您的问题,但
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();,它按照你说的编译:) -
是的,它可以,但我相信这将基于返回类型推断,isn't possible。
标签: c# .net string dynamic tostring