c# - dynamic.ToString() 意外行为

标签 c# .net string dynamic tostring

我想知道这段代码是如何工作的:

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 的方法签名它是:

enter image description here

我的猜测是 x这是一个动态变量,所以它的行为应该像 dynaString ,但事实并非如此。 Intellisense 建议我这个 x.ToString()返回 string :

enter image description here enter image description here

任何人都有使用 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/

相关文章:

C# main 函数无效

c# - 从 ObservableCollection 中删除空项

c# - 单击项目后 MenuStrip 不隐藏。漏洞?

python - 如何找到匹配项并使用 RegEx 更新它?

c# - 如何将托管结构放入 C++/native 中

c# - 从 Windows Phone 10 上的 FileOpenPicker 访问相机

c# - 方法 "Partial"返回

c - 将输入的字符存储在数组中

Bash 字符串处理(索引和连接处的字符)

c# - WPF 媒体元素的背景图像