【问题标题】:Can console.writelines handle anonymous object directly? [duplicate]console.writelines 可以直接处理匿名对象吗? [复制]
【发布时间】:2020-03-21 12:54:00
【问题描述】:

我想弄清楚为什么下面的“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
    }
}

【问题讨论】:

标签: c# console.writeline


【解决方案1】:

使用简单显示属性的ToString() 方法创建匿名类。

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    Console.WriteLine(groupA); // not ok
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2011-04-12
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多