如何从C#中的generics方法返回NULL?

我有一个这个(虚拟)代码的通用方法(是的,我知道IList有谓词,但我的代码不使用IList,但一些其他集合,无论如何,这是不相关的问题…)

static T FindThing<T>(IList collection, int id) where T : IThing, new() { foreach T thing in collecion { if (thing.Id == id) return thing; } return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead. } 

这给了我一个构build错误

“无法将null转换为types参数'T',因为它可能是一个值types,请考虑使用'default(T)'。

我可以避免这个错误吗?

两个选项:

  • 返回default(T) ,这意味着如果T是一个引用types(或可为空值types),则返回null ,对于int为0,对于char等为'\ 0'
  • 将T限制为where T : class约束的引用types,然后正常返回null
 return default(T); 

你可以调整你的约束:

 where T : class, IDisposable 

然后返回null是允许的。

将类约束作为第一个约束添加到genericstypes中。

 static T FindThing<T>(IList collection, int id) where T : class, IThing, new() 

您的其他select是将这添加到您的声明的末尾:

  where T : class where T: IList 

这样它将允许你返回null。

  1. 如果你有对象,那么需要强制转换

     return (T)(object)(employee); 
  2. 如果你需要返回null。

     return default(T); 

TheSoftwareJedi解决scheme的工作,

你也可以使用几个值和可为空的types来存档它:

 static T? FindThing<T>(IList collection, int id) where T : struct, IThing { foreach T thing in collecion { if (thing.Id == id) return thing; } return null; } 

采取错误的build议…和用户default(T)new T

你将不得不在你的代码中添加一个比较,以确保它是一个有效的匹配,如果你走这条路线。

否则,可能会考虑“find匹配”的输出参数。

这里有一个Nullable Enum返回值的工作示例:

 public static TEnum? ParseOptional<TEnum>(this string value) where TEnum : struct { return value == null ? (TEnum?)null : (TEnum) Enum.Parse(typeof(TEnum), value); } 

以下是您可以使用的两个选项

 return default(T); 

要么

 where T : class, IDisposable return null;