我有一个通用函数,可用于从sqlite数据库中检索键值对值。
函数签名为:
T Retrieve<T>(string key);
只要密钥在数据库中不存在,我都想返回null
。我可以使用此签名为reference types
做此操作,但不能使用value types
我可以将签名更改为object Retrieve(string key);
,然后将其强制转换为类型T
,但我想知道是否还有其他更好的方法可以实现这一目标。
答案 0 :(得分:5)
这里有竞争因素:
null
Nullable<T>
可以是null
,但是可以是T? Retrieve<T>(string key) where T : struct
,这将使您无法使用Retreive<string>(...)
,这似乎是一个用例所以;你不能两者兼得。您可能希望改为考虑报告结果值以及它是否单独null
,例如,其中之一:
bool TryRetrieve<T>(string key, out T value);
T Retrieve<T>(string key, out bool isNull);
(T value, bool isNull) Retrieve<T>(string key);
在遇到default(T)
时使用null
作为值。
最后一个的优点是它也适用于async
,即
async Task<(T value, bool isNull)> RetrieveAsync<T>(string key);
where-as out
参数不适用于大多数async
方案。