【问题标题】:Receiving anonymous type from a method, knowing its members at compile time从方法接收匿名类型,在编译时知道它的成员
【发布时间】:2013-05-31 12:58:30
【问题描述】:

我知道有很多关于 C# 匿名类型的问题,但没有一个能回答我。我也知道您可以返回匿名类型,将方法的结果分配给 dynamic 对象或将其转换为 this article Jon Skeet 状态,但在这两种情况下,您都需要知道哪些是匿名的成员对象,那么为什么我们不能有一个名为 anonymous 的关键字,它允许我们做这样的事情:

anonymous F()
{
    ...
    return new { a = 5, b = "some string" };
}

然后像这样使用它:

anonymous a = F();

但是有静态类型? 我的意思是,为什么编译器不能静态知道哪些是匿名对象 F 方法返回的成员,所以给我智能感知?

【问题讨论】:

  • 我确信编译器可以做到这一点,但这真的值得吗?我们已经命名了类型、动态和 ExpandoObject。支持这样的匿名类型无法使用其中之一解决的强有力的案例是什么?
  • 好吧,如果我做一个if 语句并在第一种情况下返回new { a = 5 },在第二种情况下返回new { b = "some thing" }
  • 如果方法中有条件并且方法可以返回2个不同的匿名对象,编译器会怎么做?
  • @e.campver 然后使用命名类型。老实说
  • 我不介意你接受@Pako 的回答)

标签: c# anonymous-types static-typing static-binding


【解决方案1】:

除了做这样的事情之外,你会阻止什么:

anonymous F()
{
     if (something) return new { a = 5 };
     else return new { b = 1, z = "asdf" };
}

编译器应该如何知道返回的类型呢?它是否应该在设计时使用那些匿名类型不相同的错误消息来限制您?值得付出努力吗?对于这种情况,您可以使用dynamic,或者在需要时创建实际的类 - 以使代码清晰。

【讨论】:

  • 另外,看看这个:ideone.com/F8QwHY 和这个ideone.com/hDTcxX。在第一种情况下,编译器重用 1 个类,在第二种情况下,它决定生成 2 个类。
  • 所以我什至怀疑当前状态下的编译器是否可以在设计时提供这样的错误检查。更改字段顺序后,您将获得 2 个不兼容的返回类型。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2022-07-11
相关资源
最近更新 更多