Что происходит, когда вы соединяете строку с IEnumerable <string> - PullRequest
2 голосов
/ 02 июня 2019

Я доверяю компилятору при рефакторинге, но наткнулся на что-то странное.

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

1 Ответ

3 голосов
/ 02 июня 2019

Не нужно угадывать ...

Когда вы делаете someValueOrObject + string, а someValueOrObject неявно не преобразуется в строку, тогда ToString () метод будет вызываться на someValueOrObject , чтобы получить его строковое представление (эквивалентное someValueOrObject.ToString() + string).

ToString() - это виртуальный метод, реализованный System.Objectкласс (из которого происходит любой другой тип в .NET, исключения несмотря на ).Если не переопределено, его поведение по умолчанию - возвращать (полностью определенное) имя типа экземпляра, для которого он вызывается.

Чтобы лучше это понять, вы можете запустить этот пример:

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 () is " Program + d__0", в этом примере будет получен следующий вывод:

Тип перечислимого, возвращаемого List (): Программа + d__0
Программа + d__0wtf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...