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是的,你做到了!,我只是在等待问题进一步解决,然后才接受答案。