如何从通用函数中检索值类型值?

时间:2019-02-08 06:59:00

标签: c#

我有一个通用函数,可用于从sqlite数据库中检索键值对值。

函数签名为:

T Retrieve<T>(string key);

只要密钥在数据库中不存在,我都想返回null。我可以使用此签名为reference types做此操作,但不能使用value types

做此操作

我可以将签名更改为object Retrieve(string key);,然后将其强制转换为类型T,但我想知道是否还有其他更好的方法可以实现这一目标。

1 个答案:

答案 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方案。