用VB的Option Strict On
,为什么一个Nullable(Of T)
不能当它需要一个需要显式类型转换到T的接口T
?
即
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
,这是细用于等的接口的引用。 因此,这种转换将始终成功,不像转换T
的情况下(当它出现故障Nullable
没有值),因此它可以被看作是一个隐式转换。
我现在的问题变成了“怎么样?”。 如何从一个转换Nullable(Of T)
其中有没有自己的接口)的接口T
理论上谈判?
我知道实现box Nullable<T>
这有效地去掉了Nullable
包装,但我在这里确认的概念...
(因此,我将文档审核,看看他们解释这一点。)
我没有看到这个问题?
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 = nullableVariable;
成为interfaceVariable = nullableVariable.HasValue ? (interfaceType)nullableVariable.Value : null;
interfaceVariable = nullableVariable.HasValue ? (interfaceType)nullableVariable.Value : null;
。
如果类型nullableValue.Value
实现接口,然后nullableVariable.Value
要么执行返回一个值型结果或抛出异常。 由于存在从返回值的接口保证装箱转换,中投将是合法的。 上面的代码可能会失败,如果可空变量被调用之间书面将是唯一的出路HasValue
和Value
,这样HasValue
看到变量非空,但Value
将其视为空,抛出异常。 我认为,写interfaceVariable = nullableVariable
只是测试无效一次,这样就不会发生异常; 相反,一个不确定的值会得到装箱。
实际上不阅读文档,但,我要尝试一个答案:
首先,更高级别的答案是铸造一个Nullable
到一个界面是“安全”,不会丢,所以它在逻辑上是一个Widening
经营者,不应该需要明确(相对于铸造T
,当.HasValue
是False
它抛出,所以它不应该是隐式与Option Strict On
)。
然而,技术上的“如何”是一个有点模糊的:尽管一些行为Nullable
在元数据编码通过反射可用,它的许多“神奇”的是隐藏在:
- 运行时的行为
box
上Nullable
(因此编译器知道何时离开“提升”到),和 - 通过埃里克利珀在他提出的其他点答案为C#和他们等同于VB.NET。
它看起来像S·萨默西格的博客文章宣布改变Nullable
在后期测试版的VS2k5支持也与此有关。