1

使用 VB Option Strict On,为什么 aNullable(Of T)不需要显式转换为 T 的接口,而它确实需要一个 to T

IE

Dim x As Integer? = 5
Dim y As Integer
Dim z As IComparable

y = x ' Fails to compile with error
      ' "Option Strict On disallows implicit conversions from 'Integer?' to 'Integer'."
z = x ' Succeeds

编辑:正如@SSS 所显示的(有点),部分答案是Nullable值是可以为空的,并且可以是Nothing,这对于像接口这样的引用来说很好。所以这个转换总是成功的,不像转换成Tcase (当Nullable没有值时失败),所以它可以被看作是一个隐式转换。

我的问题现在变成了“如何?”。如何从Nullable(Of T)(没有自己的接口)转换为T理论上协商的接口?

我知道实现是box Nullable<T>,它有效地剥离了Nullable包装器,但我在这里确认了这个概念......

(所以我会查看文档,看看他们是否解释了这一点。)

4

3 回答 3

1

我没看出问题?

y = x 

可能会失败,因为 x 可以持有 Nothing 的值,但不允许 y 持有 Nothing 的值。IComparable 接口允许将 Integers 与 Nothing 进行比较,因此分配很好。

请注意,如果您交换它:

x = y

那么这会成功,因为 y 的每个值都可以分配给 x。

您可以确认 Integers 可以与 Nothing 进行比较,如下所示:

MsgBox(5.CompareTo(Nothing))
于 2012-09-20T02:45:42.757 回答
0

从我在 vb.net 中可以看出,该语句interfaceVariable = nullableVariable本质上等同于interfaceVariable = if(nullableVariable.HasValue, CType(nullableVariable.Value, interfaceType), Nothing). C# 编译器似乎以同样的方式处理事情:interfaceVariable = nullableVariable;变成interfaceVariable = nullableVariable.HasValue ? (interfaceType)nullableVariable.Value : null;.

如果类型nullableValue.Value实现了接口,那么nullableVariable.Value要么执行返回值类型结果,要么抛出异常。由于存在从返回值到接口的保证装箱转换,因此强制转换是合法的。上述代码可能失败的唯一方法是,如果在对HasValueand的调用之间写入了可空变量ValueHasValue则将变量视为非空,但Value将其视为空并引发异常。我相信编写interfaceVariable = nullableVariable只是测试一次无效性,因此不会发生异常;相反,一个不确定的值会被装箱。

于 2012-09-20T14:42:16.747 回答
0

在没有实际阅读文档的情况下,我将尝试回答:

首先,更高级别的答案是,将 aNullable转换为接口是“安全的”并且不会抛出,因此它在逻辑上是一个Widening运算符并且不需要显式(与转换为相比,它T何时抛出,所以它应该不是隐含的)。.HasValueFalseOption Strict On

然而,从技术上讲,“如何”有点模糊:尽管 的某些行为Nullable被编码在可通过反射获得的元数据中,但它的大部分“魔力”隐藏在:

  • boxon a的运行时行为Nullable(因此编译器知道何时将“提升”留给那个),并且
  • Eric Lippert 在他对 C#及其在 VB.NET 中的等价物的回答中提出的其他观点。

看起来S. Somasegar 的博客文章宣布更改以Nullable支持 VS2k5 的后期 beta 版本也与此处相关。

于 2012-09-21T03:38:19.253 回答