Vb.net Nullables的隐式接口强制转换
由于VB的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
选项严格限制了
,为什么可为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的一些行为