Vb.net Nullables的隐式接口强制转换

Vb.net Nullables的隐式接口强制转换,vb.net,interface,nullable,implicit-conversion,Vb.net,Interface,Nullable,Implicit Conversion,由于VB的选项严格限制了,为什么可为null(Of T)的接口不需要显式转换到T的接口,而它确实需要一个转换到T 即 编辑:正如@SSS所显示的(某种程度上),部分答案是可以为null值是可以为null的,并且可以是Nothing,这对于接口之类的引用来说很好。因此,这种转换总是会成功的,这与转换到T的情况不同(当Nullable没有值时会失败),因此它可以被视为隐式转换 我现在的问题是“如何?”。从可空(T的)(它自己没有接口)到T的接口的转换在理论上是如何协商的 我知道这个实现是box Nu

由于VB的
选项严格限制了
,为什么
可为null(Of T)
的接口不需要显式转换到T的接口,而它确实需要一个转换到
T

编辑:正如@SSS所显示的(某种程度上),部分答案是
可以为null
值是可以为null的,并且可以是
Nothing
,这对于接口之类的引用来说很好。因此,这种转换总是会成功的,这与转换到
T
的情况不同(当
Nullable
没有值时会失败),因此它可以被视为隐式转换

我现在的问题是“如何?”。从
可空(T的)
(它自己没有接口)到
T的接口的转换在理论上是如何协商的

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


(因此,我将查看文档,看看他们是否对此进行了解释。)

我看不出问题所在

y = x 
可能会失败,因为x可以保留空值,但y不允许保留空值。然而,IComparable接口允许将整数与零进行比较,这样赋值就可以了

请注意,如果将其四舍五入:

x = y
这样就成功了,因为y的每个值都可以分配给x

您可以确认整数可以与零进行比较,如下所示:

MsgBox(5.CompareTo(Nothing))

我看不出有什么问题

y = x 
可能会失败,因为x可以保留空值,但y不允许保留空值。然而,IComparable接口允许将整数与零进行比较,这样赋值就可以了

请注意,如果将其四舍五入:

x = y
这样就成功了,因为y的每个值都可以分配给x

您可以确认整数可以与零进行比较,如下所示:

MsgBox(5.CompareTo(Nothing))

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


如果
nullableValue.Value
的类型实现了该接口,则
nullableVariable.Value
将执行返回值类型结果或引发异常。因为存在从返回值到接口的有保证的装箱转换,所以强制转换是合法的。上述代码失败的唯一方法是,如果在调用
HasValue
Value
之间写入可为null的变量,例如
HasValue
将变量视为非null,但
Value
将其视为null并引发异常。我相信编写
interfaceevariable=nullableVariable
只需测试一次空性,这样就不会发生异常;相反,一个不确定的值将被装箱。

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


如果
nullableValue.Value
的类型实现了该接口,则
nullableVariable.Value
将执行返回值类型结果或引发异常。因为存在从返回值到接口的有保证的装箱转换,所以强制转换是合法的。上述代码失败的唯一方法是,如果在调用
HasValue
Value
之间写入可为null的变量,例如
HasValue
将变量视为非null,但
Value
将其视为null并引发异常。我相信编写
interfaceevariable=nullableVariable
只需测试一次空性,这样就不会发生异常;相反,一个不确定的值将被装箱。

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

首先,更高层次的答案是,将
可空的
强制转换到接口是“安全的”,不会抛出,因此它在逻辑上是一个
加宽
操作符,不需要显式(与强制转换为
T
相比,当
.HasValue
False
时,它会抛出,因此它不应该隐式地使用
选项Strict On

然而,从技术上讲,“如何”有点模糊:尽管
Nullable
的一些行为是通过反射编码在元数据中的,但其“魔力”大多隐藏在:

  • 可为空的
    上的
    的运行时行为(因此编译器知道何时将“提升”保留到该状态),以及
  • Eric Lippert在其著作中提出的其他观点及其在VB.NET中的等效观点

在VS2k5的最新测试版中宣布对
Nullable
支持的更改似乎也与此相关。

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

首先,更高层次的答案是,将
可空的
强制转换到接口是“安全的”,不会抛出,因此它在逻辑上是一个
加宽
操作符,不需要显式(与强制转换为
T
相比,当
.HasValue
False
时,它会抛出,因此它不应该隐式地使用
选项Strict On

然而,从技术上讲,“如何”有点模糊:尽管
Nulla的一些行为