我想我知道为什么,但是如果有人能启迪我为什么这样做,在我以IStoreable
是接口的情况下编写此方法,将不胜感激
public bool TryRetrieveItem<T>(string itemKey, out T item) where T : IStoreable
{
item = default(T);
if (this.RetrieveItem(itemKey, out IStoreable retItem))
{
item = (retItem as T);
return true;
}
return false;
}
对此item = (retItem as T);
并且要解决此问题,我必须在where子句中添加class
限制。
由于已经在接口上限制了T,为什么要这样做?是否因为接口可以通过非引用类型实现?还是我弄错了细节?
答案 0 :(得分:4)
是因为接口可以通过非引用类型实现吗?
是的
您使用的as
运算符只能执行引用类型转换。它尝试将变量转换为所需的类型。如果失败,则表达式的计算结果为null
。它不适用于值类型,因为值类型不能为null
。
这就是为什么您必须将T
限制为一个类。
或者,您可以将as
更改为演员表。
item = (T)retItem;
如果执行此操作,则不需要T
上的引用类型约束,但是如果转换失败,它将引发异常。
第三种选择是使用模式匹配来检查retItem
的类型:
if (retItem is T t) {
item = t;
}