Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:';默认值';带泛型的关键字_C#_Generics_Resharper - Fatal编程技术网

C#:';默认值';带泛型的关键字

C#:';默认值';带泛型的关键字,c#,generics,resharper,C#,Generics,Resharper,我编写了以下方法来从可序列化类(POCO)列表返回不可序列化类(LINQ类)列表: 我的问题是这一变化实际上改善了或阻止了什么发生?我知道上下文中的默认关键字与泛型有关,但我不确定它到底代表了什么 PS.UnSerializableEntity和SerializableEntity是类泛型。如果SerializableEntity是值类型,则它永远不能为null。因此,if语句的主体将始终执行,因为它正在检查null。default关键字将返回泛型类型的默认值。对于引用类型,默认值为null。对

我编写了以下方法来从可序列化类(POCO)列表返回不可序列化类(LINQ类)列表:

我的问题是这一变化实际上改善了或阻止了什么发生?我知道上下文中的默认关键字与泛型有关,但我不确定它到底代表了什么


PS.
UnSerializableEntity
SerializableEntity
是类泛型。

如果
SerializableEntity
是值类型,则它永远不能为
null
。因此,
if
语句的主体将始终执行,因为它正在检查
null
default
关键字将返回泛型类型的默认值。对于引用类型,默认值为
null
。对于值类型,它是零(或该值类型的任何零表示)

如果只希望引用类型作为实体,则应在泛型参数上设置约束。例如:

List<UnSerializableEntity> ToListOfUnserializables(List<SerializableEntity> entityList)
    where SerializableEntity : class
列出ToListOfUnserializables(列出entityList)
其中SerializableEntity:类

肯特的回答是准确的,但要更明确地回答您关于Resharper的问题以及它为什么抱怨:

对于引用类型(类),检查null就足够了,因为这被认为是引用类型的“默认”值。但是,对于值类型(例如结构),默认值永远不会为null。因此,由于SerializableEntity和UnSerializableEntity是泛型,您可以将它们指定为引用类型或值类型,因此您所做的空检查可能不是您想要的。您需要检查的是确保参数是您真正想要关心的。在引用类型的情况下,您不想关心null对象。在值类型的情况下,您不想担心“归零”值


例如:假设您指定一个DateTime作为正在处理的数据类型。是否确实要添加未设置任何值的日期时间?DateTime的默认值是1/1/0001,不是空的,因此您需要使用
if(!Equals(e,default(SerializableEntity))
not
if(e!=null)

检查该值,这是否意味着它将始终执行“if”块永远不会执行:值类型将引发异常。@Simon语句e!=零和!当e不为null时,等于(e,默认值(SerializableEntity))均为true/default@Joel,如果
e
是值类型,则针对
null
进行测试不会引发异常。你指的是其他例外吗?
if (!Equals(e, default(SerializableEntity))) 
List<UnSerializableEntity> ToListOfUnserializables(List<SerializableEntity> entityList)
    where SerializableEntity : class