限制条件包含接口时,类子句在通用类型限制中的用法

时间:2019-02-16 18:46:22

标签: c# generics casting

我想我知道为什么,但是如果有人能启迪我为什么这样做,在我以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,为什么要这样做?是否因为接口可以通过非引用类型实现?还是我弄错了细节?

1 个答案:

答案 0 :(得分:4)

  

是因为接口可以通过非引用类型实现吗?

是的

您使用的as运算符只能执行引用类型转换。它尝试将变量转换为所需的类型。如果失败,则表达式的计算结果为null。它不适用于值类型,因为值类型不能为null

这就是为什么您必须将T限制为一个类。

或者,您可以将as更改为演员表。

item = (T)retItem;

如果执行此操作,则不需要T上的引用类型约束,但是如果转换失败,它将引发异常。

第三种选择是使用模式匹配来检查retItem的类型:

if (retItem is T t) {
    item = t;
}