Nullables的隐式接口铸(Implicit Interface casts of Nullab

2019-10-17 06:11发布

用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包装,但我在这里确认的概念...

(因此,我将文档审核,看看他们解释这一点。)

Answer 1:

我没有看到这个问题?

y = x 

可能因为X可容纳没有的价值,但Y不是允许持有没有任何的价值。 IComparable接口允许以整数然而相比没有什么,这样的分配是罚款。

请注意,如果你将其交换轮:

x = y

那么这种成功,因为Y的每一个值可以被分配到X。

您可以确认整数可以如下相比,没有什么:

MsgBox(5.CompareTo(Nothing))


Answer 2:

从我可以在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要么执行返回一个值型结果或抛出异常。 由于存在从返回值的接口保证装箱转换,中投将是合法的。 上面的代码可能会失败,如果可空变量被调用之间书面将是唯一的出路HasValueValue ,这样HasValue看到变量非空,但Value将其视为空,抛出异常。 我认为,写interfaceVariable = nullableVariable只是测试无效一次,这样就不会发生异常; 相反,一个不确定的值会得到装箱。



Answer 3:

实际上不阅读文档,但,我要尝试一个答案:

首先,更高级别的答案是铸造一个Nullable到一个界面是“安全”,不会丢,所以它在逻辑上是一个Widening经营者,不应该需要明确(相对于铸造T ,当.HasValueFalse它抛出,所以它不应该是隐式与Option Strict On )。

然而,技术上的“如何”是一个有点模糊的:尽管一些行为Nullable在元数据编码通过反射可用,它的许多“神奇”的是隐藏在:

  • 运行时的行为boxNullable (因此编译器知道何时离开“提升”到),和
  • 通过埃里克利珀在他提出的其他点答案为C#和他们等同于VB.NET。

它看起来像S·萨默西格的博客文章宣布改变Nullable在后期测试版的VS2k5支持也与此有关。



文章来源: Implicit Interface casts of Nullables