Vb.net 为什么一些涉及文本的缩小转换不需要CType?

Vb.net 为什么一些涉及文本的缩小转换不需要CType?,vb.net,Vb.net,Double类型仅限于示例,它是一个类。我不希望它包含一些双值。NaN是我不想要的值的一个例子。编译器不会抱怨TestMe中的文本赋值。为什么不呢?如果使用类型为Double的变量,但不使用常量或文本,则它确实提供了“Strict On”选项,禁止从“Double”隐式转换为“example”错误 Option Strict On Public Class example Private d As Double Public Shared Sub TestMe()

Double类型仅限于示例,它是一个类。我不希望它包含一些双值。NaN是我不想要的值的一个例子。编译器不会抱怨TestMe中的文本赋值。为什么不呢?如果使用类型为Double的变量,但不使用常量或文本,则它确实提供了“Strict On”选项,禁止从“Double”隐式转换为“example”错误

Option Strict On

Public Class example

   Private d As Double

   Public Shared Sub TestMe()
      Dim x As example

      x = Double.NaN

   End Sub

   Public Sub New(d As Double)
      If Double.IsNaN(d) Then
         Throw New ArgumentOutOfRangeException()
      End If
      Me.d = d
   End Sub

   Public Shared Narrowing Operator CType(value As Double) As example
      Return New example(value)
   End Operator

End Class
请注意,这只是一个简单的例子来说明我对编译器行为的好奇

问一个类似的问题,尽管编译器的行为非常简单,并且示例不涉及操作符重载。再说一遍,VB编译器不允许以下任何一种文字赋值,那么为什么它应该允许我的示例中的那个呢

Dim i As Integer

i = 4.0#
i = UInt32.MaxValue

我不明白这个问题。这很有效。如果尝试将Double.NaN:Dim example指定为example=Double.NaN,则会引发异常。我也不明白为什么编译器应该抱怨asssigning x=Double.NaN。它会在运行时抛出异常,这是真的,但问题是关于编译器的。编译器应该抱怨,IMO,因为这是一个缩小的转换,并且选项strict处于启用状态。对不起,我混淆了x和n。但是构造函数也会在Dim x的运行时抛出异常,比如example=Double.NaN。缩小转换是在运行时完成的。@TimSchmelter,我承认缩小转换是在运行时完成的,但这不是重点。这是一个关于编译器的问题,当指定Option Strict On时,编译器不允许对隐式缩小转换进行编码。我应该得到一个严格禁止隐式转换的选项。。。与任何其他隐式变窄转换一样,例如Dim I as Integer=4.0。我应该能够将Dim n编码为exampledoull.NaN,但我不应该将Dim n编码为example=Double.NaN。