首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当您将字符串与IEnumerable<string>连接时会发生什么?

当您将字符串与IEnumerable<string>连接时会发生什么?
EN

Stack Overflow用户
提问于 2019-06-02 19:01:32
回答 1查看 61关注 0票数 2

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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-02 19:21:29

不用猜..。

当您执行someValueOrObject + string时,并且someValueOrObject不能隐式转换为字符串,则将在someValueOrObject上调用ToString()方法以获得其字符串表示形式(等效于someValueOrObject.ToString() + string)。

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

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

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56418060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档