gpt4 book ai didi

c# - 当限制已包含接口(interface)时,在泛型类型限制中使用类子句

转载 作者:行者123 更新时间:2023-12-03 22:23:37 25 4
gpt4 key购买 nike

我想我知道为什么,但如果有人能启发我为什么,当我编写这个方法时,IStoreable是一个接口(interface):

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;
}

对此项目进行投诉 = (retItem as T);

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

既然我已经在接口(interface)上限制了 T,为什么我应该这样做?是因为接口(interface)可以用非引用类型来实现吗?或者也许我的细节有误?

最佳答案

Is it because interfaces can be implemented by non-reference types?

是的。

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

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

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

item = (T)retItem;

如果这样做,则不需要对 T 进行引用类型约束,但转换失败时会抛出异常。

第三种替代方法是使用模式匹配检查 retItem 的类型:

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

关于c# - 当限制已包含接口(interface)时,在泛型类型限制中使用类子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54726465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com