1

我目前正在阅读泛型部分,并遇到了一个标题为“转换类型约束”的部分。我无法理解 Jon 的解释,所以我在 Google 中输入了这个词,没有找到使用这个确切短语的结果,也没有更详细地解释它。

有没有人有任何网站/页面更详细地描述了“转换类型约束”?或者也许有人知道一个更广泛使用的术语来描述它们?

给出的描述是:A constraint that lets you specify another type that the type argument must be implicitly convertible to via an identity, reference or boxing conversion

4

3 回答 3

1

我认为 Jon 只是使用他自己的术语来表示类型参数约束,就像 Tim 已经说过的那样,有据可查。也许他被(可能不完全正确)错误消息“类型'x'必须可转换为'y'以便将其用作参数T ...”误导了他,如果类型约束包括类或接口,并且传递的类型不是从该类派生的,分别不实现接口。

这里最大的问题是,“可转换”是什么意思。类型参数约束的文档只说如果约束是类或接口,则类型必须从该类派生或实现接口。传递未派生或未实现接口的类型会导致上述错误消息。

即使未派生或未实现接口的类型实现了允许转换的隐式转换运算符,它也不能用于类型参数(确保我尝试过)。

我没有想到另一种可能的“转换”。如果一个类派生自另一个类或使用基类型或接口实现引用实例的接口,则不是真正的转换,而是多态。

于 2013-11-05T14:00:58.657 回答
1

是的,这不是一个官方术语——据我所知,在第 10.1.5 节中显示的构造中列为类类型接口类型类型参数的三个类似约束没有一个官方术语的 C# 规范。

遗憾的是,这组约束没有官方术语,因为它们显然密切相关 - 它们都用于约束类型参数,以便从类型参数到指定的约束类型。

于 2013-11-06T10:00:41.607 回答
1

我认为 Jon 只列举了支持的约束。您可以在下面找到关于标识、引用和装箱转换的简短描述,如 MSDN C# Language Specification中所述。

6.1.1 身份转换

身份转换从任何类型转换为相同类型。这种转换仅存在于已经具有所需类型的实体可以被称为可转换为该类型的情况。

6.1.4 隐式引用转换

隐式引用转换是:

  • 从任何引用类型到对象。
  • 从任何类类型 S 到任何类类型 T,只要 S 派生自 T。
  • 从任何类类型 S 到任何接口类型 T,只要 S 实现了 T。
  • 从任何接口类型 S 到任何接口类型 T,只要 S 派生自 T。
  • 从元素类型为 SE 的数组类型 S 到元素类型为 TE 的数组类型 T,只要满足以下所有条件:
    • S 和 T 仅在元素类型上有所不同。换句话说,S 和 T 具有相同的维数。
    • SE 和 TE 都是引用类型。
    • 从 SE 到 TE 存在隐式引用转换。
  • 从任何数组类型到 System.Array。
  • 从任何委托类型到 System.Delegate。
  • 从空类型到任何引用类型。

隐式引用转换是可以证明总是成功的引用类型之间的转换,因此在运行时不需要检查。引用转换,无论是隐式的还是显式的,都不会改变被转换对象的引用标识。换句话说,虽然引用转换可能会改变引用的类型,但它永远不会改变被引用对象的类型或值。

6.1.5 装箱转换

装箱转换允许将值类型隐式转换为引用类型。将值类型的值装箱包括分配对象实例并将值类型值复制到该实例中。

另见4.3.1 装箱转换

标准 ECMA-334,C# 语言规范中有专门的章节介绍转换(参见13. 转换

于 2013-11-05T13:51:06.243 回答