gpt4 book ai didi

c# - 使用 IEnumerable 连接字符串时会发生什么

转载 作者:行者123 更新时间:2023-11-30 21:28:31 25 4
gpt4 key购买 nike

我在重构时信任编译器,但偶然发现了一些奇怪的东西。

public static void Main()
{
Console.WriteLine(List() + "wtf"); // no compilation error
}

public static IEnumerable<string> List() {
yield return "abc";
yield return "xyz";
}

谁能解释编译器接受这个的原因是什么?

PS:既然你知道它不会抛出异常,猜猜控制台将输出什么。答案在这里:https://dotnetfiddle.net/9nz8Bl

最佳答案

无需猜测...

当您执行 someValueOrObject + string 时,someValueOrObject 不能隐式转换为字符串,然后将调用 ToString() 方法在 someValueOrObject 上获取其字符串表示形式(相当于 someValueOrObject.ToString() + string)。

ToString()是由 System.Object 类(.NET 中的任何其他类型派生自该类,exceptions notwithstanding)实现的虚方法。除非被覆盖,否则其默认行为是返回调用它的实例的(完全限定的)类型名称。

为了更好地理解这一点,您可能需要运行这个示例:

using System;
using System.Collections.Generic;

public class Program
{
public static void Main()
{
var l = List();
Console.WriteLine("Type of enumerable returned by List(): " + l.GetType().FullName);
Console.WriteLine(l + "wtf");
}

public static IEnumerable<string> List() {
yield return "abc";
yield return "xyz";
}
}

( https://dotnetfiddle.net/H0hl4O )

假设迭代器方法 List() 返回的编译器生成的可枚举对象的类型名称是“Program+ d__0 ”,这个例子会产生以下输出:

Type of enumerable returned by List(): Program+<List>d__0
Program+<List>d__0wtf

关于c# - 使用 IEnumerable<string> 连接字符串时会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56418060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com