Linq to sql 可空枚举(?)和LinqToSQL

Linq to sql 可空枚举(?)和LinqToSQL,linq-to-sql,enums,null,Linq To Sql,Enums,Null,我有以下声明: select new Action { ParentContentType = action.ParentContentType != null ? (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) : null }; ParentContentType是ContentType类型的可空枚举 action.ParentContentType映射到可为null的int的数

我有以下声明:

select new Action {
     ParentContentType = action.ParentContentType != null ? (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) : null 
};
ParentContentType是ContentType类型的可空枚举

action.ParentContentType映射到可为null的int的数据库表

如果action.ParentContentType不为null,我将使用以下方法确定枚举值:

(ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType)
当action.ParentContentTypenull时,我尝试将可为null的枚举设置为null值

这无法编译,我得到:

Error   1 Type of conditional expression cannot be determined because there is no implicit conversion between ContentType' and '<null>' 

我同意您的想法,即
ContentType.Null
ContentType.Empty
否则您将在整个应用程序中检查空值。。。Plus
ContentType.Empty
更具描述性。

null
是非类型化的。您必须显式地强制转换它,因为?C#中的运算符要求第二个参数必须与第一个参数的类型完全相同(或可隐式转换)

由于这两个类型必须相同,并且
null
不能强制转换为值类型,因此它们都必须是可为null的类型:

select new Action {
  ParentContentType = action.ParentContentType != null ?
    (ContentType?)Enum.ToObject(typeof(ContentType), action.ParentContentType) :
    (ContentType?)null 
};
然而,这是相当模糊的。我甚至从未想过可以创建枚举的可空值(我想你可以,因为你发布了这个问题——我从未尝试过)

正如您所建议的,使用表示“无”的枚举值可能会更好。这对大多数开发人员来说就不那么令人惊讶了。您只是不希望枚举可以为空。

奇怪的是:

ParentContentType = action.ParentContentType == null ? ContentType.EMPTY : (ContentType)Enum.ToObject(typeof(ContentType), action.ParentContentType) 
结果出现异常:

The argument 'value' was the wrong type. Expected 'Enums.ContentType'. Actual 'System.Object'.
The argument 'value' was the wrong type. Expected 'Enums.ContentType'. Actual 'System.Object'.

WTF?

实际上,在这种情况下,强制转换null将导致异常“无法转换表达式”!真奇怪。上面的代码为我编译并运行。你能发布ParentContentType类型的定义吗?ParentContentType也是枚举吗?那么它应该有一个ContentType.Empty吗?action.ParentContentType是一个可为null的int,并且源于数据库。但是,数据库中的值不应该==null。啊!上面的内容也为我编译和运行。我不知道——我们一定缺少了一些关于类型定义的信息。我只是在我维护的代码库中遇到了这个问题。。不确定解决方案是什么?