我想知道这段代码是如何工作的:
dynamic dynaString = 2;
string b = dynaString.ToString();
当这个不起作用时:
var list = new List<dynamic>();
var liststring = new List<string>();
liststring = list.Select(x => x.ToString()).ToList();
我知道我可以添加 Cast<string>
在 Select 语句之后,但这并不能解释该行为。为什么 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 语句中被声明为动态的。
最佳答案
根据 dynamic type docs :
The dynamic type indicates that use of the variable and references to its members bypass compile-time type checking. Instead, these operations are resolved at run time.
Type dynamic behaves like type object in most circumstances. In particular, any non-null expression can be converted to the dynamic type. The dynamic type differs from object in that operations that contain expressions of type dynamic are not resolved or type checked by the compiler.
如果在编译时绕过类型检查和/或解析,则无法从用法中推断类型。
如果您省略泛型类型参数,即使您调用 ToString()
方法,它也会默认返回 dynamic
类型。原因是任何非空表达式都可以分配给 dynamic
。由于 dynamic
是源,它也是 Select(x => x.ToString())
方法调用的结果。
另一方面,您可以在调用返回 string< 的
实例。ToString()
时将 dynamic
对象分配给 string
变量
关于c# - dynamic.ToString() 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57270215/