在重构时,我相信编译器,但偶然发现了一些奇怪的东西。
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
发布于 2019-06-02 19:21:29
不用猜..。
当您执行someValueOrObject + string时,并且someValueOrObject不能隐式转换为字符串,则将在someValueOrObject上调用ToString()方法以获得其字符串表示形式(等效于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)
假设迭代器方法列表()返回的编译器生成的可枚举对象的类型名为"Program+d__",则此示例将产生以下输出:
List()返回的可枚举类型: Program+d__0 Program+d__0wtf
https://stackoverflow.com/questions/56418060
复制相似问题