【问题标题】:Why is Guid NOT an object in c#?为什么 Guid 不是 c# 中的对象?
【发布时间】:2013-02-26 08:16:40
【问题描述】:

我刚刚得到以下异常,这似乎表明Guid 不是一个对象。

“System.Guid”类型的表达式不能用于返回类型 '系统.对象'

Guid 怎么不是对象?

编译器是如何解决这个问题的?当类型不是对象时,必须有一些东西可以让我在运行时检测到,如果是这样,那会是什么?

====================编辑附加信息====================

Expression.Lambda<Func<object>>(SomeExpression)

SomeExpression 可以是 Guid 的常量值,这很重要。

【问题讨论】:

  • 是的,但我不想强制转换,我怎么知道某些事情是否会立即奏效?表达式工作正常,直到我处理本机/值类型的东西。
  • 您的问题缺少示例代码(最好是带有 MSDN 链接的 CSXXXX 错误代码,因此您可以对不清楚的地方发表评论)。

标签: c# reflection casting expression-trees


【解决方案1】:
Expression.Lambda<Func<object>>(SomeExpression)

这里的问题是您错误地使用了表达式树。尽管盒子操作在 C# 中是隐式的,但它仍然存在。它隐含在表达式树中。以下应该解决它:

Expression.Lambda<Func<object>>(
    Expression.Convert(SomeExpression, typeof(object))

您也可以检查SomeExpression.Type.IsValueType 来决定是否添加这个额外的显式转换。

【讨论】:

  • Marc,隐式转换一直工作正常,直到我处理 Guid。它适用于我的字典、列表、自定义复杂类 - 你可以命名它。我不认为 Guid 是唯一的例外,但它绝对是其中之一。
  • @Alwyn 你提到的一切都是一个引用类型。正如我所说:盒子操作必须是明确的。 Guid 是一个值类型(一个struct
  • @MarcGravell Gotcha,这可以解释很多事情,所以你需要对值类型进行装箱。所有引用类型都可以免费通行证。
  • @Alwyn 是的;关键是从(比如)SomeClassobject 的转换是保值的:它完全输入和输出相同的值 - 一个微不足道的无操作。这与必须明确表示的框非常不同。
  • @MarcGravell 谢谢,这是我正在寻找的答案,你能告诉我在哪里可以学到更多关于你使用的一些术语的信息吗?我承认其中一些听起来有点陌生。什么是微不足道的“无操作”以及与“盒子”的区别?
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2011-02-11
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多