【发布时间】:2018-06-29 03:45:56
【问题描述】:
考虑
public static T Get<T>(this ICache cache, string key)
{
var obj = cache.Get(key);
return (T)obj;
}
如果 T 恰好是 Guid,而 obj 为 null(缓存中不存在),则会发生异常,因为 Guid 不能为 null。是否可以让 Get 工作?我尝试添加 typeof(T) == typeof(Guid) 检查,但无法将 Guid 投射到 T. Puzzler 中!
更新 @mihai,因为不适合我
Update2 由于 Guid 不可为空,所以我想我会寻找默认 (Guid),即 Guid.Empty。应该把它放在原始请求中。感谢大家的贡献。
【问题讨论】:
-
在这种情况下您想要返回什么?如果不是例外,那么它必须是某个特定值。也许是默认值?由你决定。编译器不会为你做决定。
-
默认值(Guid.Empty)
-
您可以使用反射来验证底层类型。但那将是完全不同的蠕虫罐头。
-
请注意,这可能非常危险。例如,假设您的缓存中有
x --> 1,而您调用cache.Get<double>("x")——会发生什么?您可以将 unboxed 强制转换为 double,但不能将已装箱的 int 强制转换为 double,而这里有一个已装箱的 int。
标签: c#