C# 当限制已包含接口时,在泛型类型限制中使用class子句

C# 当限制已包含接口时,在泛型类型限制中使用class子句,c#,generics,casting,C#,Generics,Casting,我想我知道为什么,但如果有人能告诉我为什么,当我写这个方法时,istorable是一个接口,我将不胜感激: public bool TryRetrieveItem(string itemKey,out T item),其中T:IStoreable { 项目=默认值(T); if(此.RetrieveItem(itemKey,out-Istorable RetieItem)) { 项目=(重设项目为T); 返回true; } 返回false; } 投诉此项=(重设为T) 为了解决这个问题,我必须

我想我知道为什么,但如果有人能告诉我为什么,当我写这个方法时,
istorable
是一个接口,我将不胜感激:

public bool TryRetrieveItem(string itemKey,out T item),其中T:IStoreable
{
项目=默认值(T);
if(此.RetrieveItem(itemKey,out-Istorable RetieItem))
{
项目=(重设项目为T);
返回true;
}
返回false;
}
投诉此
项=(重设为T)

为了解决这个问题,我必须在where子句中添加
class
限制

既然我已经在接口上限制了T,为什么要这样做?是因为接口可以由非引用类型实现吗?或者我把细节搞错了

是因为接口可以由非引用类型实现吗

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

这就是为什么必须将
T
约束到类

或者,您可以将
更改为
转换为强制转换

item = (T)retItem;
如果执行此操作,则不需要对
t
设置引用类型约束,但当转换失败时,它将抛出异常

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

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

是否因为接口可以由非引用类型实现是。:“结构可以实现接口,但不能从另一个结构继承”为什么还要在泛型方法中使用
istorable
T
应该足够了。@Sweeper是的,你做到了!,我只是在等待问题进一步解决,然后才接受答案。