为什么Guid不是c#中的对象?

为什么Guid不是c#中的对象?,c#,reflection,casting,expression-trees,C#,Reflection,Casting,Expression Trees,我刚刚得到了以下异常,它似乎表明Guid不是一个对象 “System.Guid”类型的表达式不能用于返回类型 “System.Object” Guid怎么不是对象 编译器是如何计算出来的?当一个类型不是一个对象时,一定有某种东西可以让我在运行时检测到,如果是,这会是什么 ============================使用其他信息编辑==================== Expression.Lambda<Func<object>>(SomeExpressio

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

“System.Guid”类型的表达式不能用于返回类型 “System.Object”

Guid
怎么不是对象

编译器是如何计算出来的?当一个类型不是一个对象时,一定有某种东西可以让我在运行时检测到,如果是,这会是什么

============================使用其他信息编辑====================

Expression.Lambda<Func<object>>(SomeExpression)
Expression.Lambda(SomeExpression)
其中SomeExpression可以是Guid的常量值,这很重要。

Expression.Lambda(SomeExpression)
Expression.Lambda<Func<object>>(SomeExpression)
这里的问题是您使用的表达式树不正确。尽管box操作在C#中是隐式的,但它仍然存在。它在表达式树中不是隐式的。应通过以下方式解决此问题:

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

您还可以检查
SomeExpression.Type.IsValueType
以决定是否添加此额外的显式转换。

这似乎是相关的:是的,但我不想强制转换,我怎么知道bat是否会起作用呢?在我处理本机/值类型的内容之前,表达式工作正常。您的question缺少示例代码(最好是带有MSDN链接的CSXXXX错误代码,因此您可以对不清楚的内容进行注释).Marc,隐式转换一直正常工作,直到我处理Guid为止。它与我的字典、列表、自定义复杂类配合得很好。我不认为Guid是唯一的例外,但它肯定是其中之一。@Alwyn和您提到的所有内容都是引用类型。正如我所说的:box操作必须是显式的。
Guid
一个值类型(a
struct
)@MarcGravell Gotcha,这可以解释很多事情,因此您需要对值类型进行装箱。所有引用类型都可以自由通过。@Alwyn yes;关键是从(比如)转换
SomeClass
object
是值保留的:输入和输出的值完全相同——这是一个微不足道的禁止操作。这与必须显式表示的框非常不同。@MarcGravel谢谢这是我在寻找的答案,你能给我一个提示,让我在哪里可以学到更多关于你使用的一些术语吗我承认其中一些听起来有点陌生。一个微不足道的“不可操作”和一个“盒子”有什么区别?