【问题标题】:Can you return an 'anonymous struct'? [duplicate]你能返回一个“匿名结构”吗? [复制]
【发布时间】:2016-07-02 10:39:44
【问题描述】:

此答案描述了在 C# 中构造“匿名结构”:Is there an equivalent C# syntax for C's inline anonymous struct definition?

var x = new { SomeField = 1, SomeOtherField = "Two" };

从方法中返回 this 以避免显式定义结构是否有效?对该答案的评论说不,但那是 2011 年......

【问题讨论】:

  • 请解释您为什么要从方法中返回它。您可以使用 objectdynamic,但需要这样做的原因通常是设计味道。
  • 你会想要创建一个类来返回,或者返回一个Tuple,或者冒险进入一些不推荐的领域来解决这样一个简单的问题
  • @CodeCaster 纯粹是为了返回命名参数(如在链接问题中),而无需在某处声明结构/类。
  • 不建议,但在这种情况下您可以返回IDictionary<string, object>
  • 从技术上讲,这是一个匿名对象...是的,您可以检索它...您甚至可以做坏事来恢复它。

标签: c# .net-4.5


【解决方案1】:

这不是struct,它是C# 中的Anonymous Type(实际上由编译器实现为class)。匿名类型在本地范围内声明,您不能将其作为 C# 中的强类型类传递,因为它是编译器生成的类。您的选择是使用 objectdynamic 作为返回类型,但您仍然会丢失基础类型。

总结你的问题,答案很简单“不是你想要的工作方式”。

【讨论】:

  • 等等,你当然可以退货(并传递它)。你只是不能返回它的类型。
  • dynamic 应该作为返回类型不工作?
  • @KonradRudolph 我已经修正了我之前回答中的错误术语。
  • object 也可以正常工作
  • 但是如果你愿意这样做,创建一个类会更快(并且更不容易出错):)
【解决方案2】:

MSDN 说:

匿名类型是直接从对象派生的类类型,并且不能转换为除对象之外的任何类型。编译器为每个匿名类型提供一个名称,尽管您的应用程序无法访问它。从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有什么不同。

因此您可以将其作为object 返回,但之后您不能对它们做太多事情,除非您使用反射或动态。

如果您的真正意图是返回多个值,请改用Tuple<...> 类型:

return Tuple.Create<int, string>(1, "Two");

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 2019-11-17
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多