如何从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。
-
如果你有对象,那么需要强制转换
return (T)(object)(employee);
-
如果你需要返回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;