console.writelines 可以直接处理匿名对象吗?

Can console.writelines handle anonymous object directly?

想弄明白为什么下面"Console.WriteLine(x)"可以直接打印匿名对象的对象?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


class program
{
    static void Main()
    {
        var groupA = new[] { 3, 4, 5, 6 };
        var groupB = new[] { 6, 7, 8, 9 };
        var someInts = from a in groupA
                       from b in groupB
                       where a > 4 && b <= 8
                       select new { a, b, sum = a + b }; // object of Anonymous tyoe
        foreach (var x in someInts)
            Console.WriteLine(x); // ok
        // Console.WriteLine(groupA); // nok
    }
}

匿名 class 使用 ToString() 方法创建,仅显示属性。

ToString()WriteLine() 和许多其他方法隐式调用。

对于数组,ToString() 仍在被调用,但它没有被覆盖,所以只给出完全限定名称的默认文本。

您不希望自动显示数组,因为它可能包含数百万个项目。这对于匿名类型来说不太可能(尽管可能)。

匿名 class 与任何其他 class 一样,只是它是隐式的。这意味着它(像任何其他 class 一样)可以包含属性或成员,在您的情况下,整数作为其内部的一部分。所以

Console.WriteLine(x); // makes sense. x is just an integer

理论上,如果您采用任何显式 class 并对其求值 .ToString(),您就会得到它的名字。所以理论上,如果你做了 groupA.ToStrint() 你应该得到“Anonymous.abjdhjNxx1”或者其他什么。实际上,您可以在该行断点并将手表添加到您的 groupA 变量以查看它。它仍然只是一个变量,它仍然是类型安全的,你只是永远不知道你的类型的 "name" 会是什么,因为运行时中间环境会随着它的进行而组成它。然而,正如这里所暗示的那样,它是胡言乱语,因此 Microsoft 的好心人决定不直接向我们展示它。这就是为什么

Console.WriteLine(groupA); // not ok

如果你愿意,你仍然可以做到

Console.WriteLine(groupA.GetType().Name);

但我无法想象你为什么要这样做,因为如前所述,它是胡言乱语