为什么不能从泛型约束隐式地推断出“ this”的类型转换?

布鲁诺·泽尔

我有以下课程:

public class Item<TItem>
    where TItem : Item<TItem>
{
    void GetReference()
    {
        TItem item = this;
    }
}

这会TItem item = this;产生一个编译器错误“无法Item<TItem>隐式转换TItem”。

但是,为什么我们需要在这里进行转换?我们已经定义了约束where TItem : Item<TItem>,因此可以认为根本不需要转换,因为这两种类型是相同的,不是吗?

顺便说一句,可以进行显式转换。编译器错误中也说明了这一点。

乔恩·斯基特

因为那不安全。考虑:

public class GoodItem : Item<GoodItem>
{
    // No problem
}

public class EvilItem : Item<GoodItem>
{
    // GetReference body would be equivalent to 
    // GoodItem item = this;
    // ... but this *isn't* a GoodItem, it's an EvilItem!
}

EvilItem完全满足的约束TItem-GoodItem确实源自Item<GoodItem>

您无法真正表达要声明与类型参数之间的关系

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么 TypeScript 不能推断出这种泛型类型?

不能隐式转换类型-泛型

为什么不能强制转换的泛型类型无法隐式转换?

为什么不能从构造函数中推断出Kotlin超类型参数?

不能推断出可选的泛型类型的参数

为什么Haskell不能推断出这种类型

从嵌套泛型推断出泛型类型参数

隐式转换泛型类型对象

为什么我不能(通过约束)将派生泛型类型转换为基础非泛型类型?

为什么协变隐式强制转换会忽略泛型约束?

隐式转换的类型推断

为什么不能为泛型类型推断类型实参?

为什么这个表达式不能从使用泛型类型转换为使用基类型?

为什么不能隐式转换模板类型参数?

泛型类型的隐式转换失败,接口类型

如果类型参数约束指定类型,为什么不能从用法推断类型参数?

为什么我不能显式地将类型参数传递给泛型Java方法?

为什么不能从与委托方法相同的泛型定义的参数中推断出泛型?

为什么简单地“捕获”?是否可以推断出编译时类型安全性?

为什么Haskell编译器可以推断出这种类型,但是ghci不能?

为什么 TypeScript 不能推断出这个函数的返回类型?

为什么编译器不能推断出返回类型?

为什么TypeScript不能在嵌套对象中推断出通用类型?

为什么Haskell不能推断出这种类型是正确的?

为什么不能通过初始化的参数推断出通用结构类型?

从使用的类型泛型之一推断出泛型类型

C# 尝试返回泛型列表“不能隐式转换类型”

Lambda类型推断和隐式转换

隐式转换IEnumerable为泛型类型