限制对结构的接口只有在vb.net

我有一个接口IDigitalState定义为限制对结构的接口只有在vb.net

Public Interface IDigitalState 

ReadOnly Property Code As Integer

ReadOnly Property Name As String

End Interface

,并实现该接口

Public Structure DigitalState 

Implements IDigitalState

Private ReadOnly mCode As Integer

Private ReadOnly mName As String

Public ReadOnly Property Code As Integer Implements IDigitalState.Code

Get

Return mCode

End Get

End Property

Public ReadOnly Property Name As String Implements IDigitalState.Name

Get

Return mName

End Get

End Property

Public Sub New(ByVal code As Integer, name As String)

mCode = code

mName = name

End Sub

End Structure

我想做一个结构是声明一个变量作为IDigitalState的可空类型。我明白为什么我不能这样做,因为接口可能由一个不允许为空的类来实现。有没有一种方法来定义接口,以便它只能通过结构来实现。我怀疑这是可能的,但认为这是值得研究的。

回答:

不,没有办法。

但是,您可以键入。

Dim nullableIDigitalState As IDigitalState = nothing 

这将声明IDigitalState类型的变量为null。如果你在谈论Nullable<>泛型,它具有限制值类型的where限制,所以它只接受IDigitalState的结构变体。

我想念你的观点吗?

回答:

可以与泛型结合使用。例如:

Sub Test(Of T As {IDigitalState, Structure})() 

Dim something As T? = GetEitherValueOrNull …

End Sub

这里的关键是,你在一个具体的操作(通用)型T它有两个条件:

  1. 它是一个结构,
  2. 它实现IDigitalState

或者,你可以使用的接口类型,可以是Nothing的正常变化,而不需要一个Nullable

回答:

将接口实现限制为结构类型的唯一情况是接口类型将被用作通用约束,而不是存储位置类型。在这种情况下,任何需要类型参数的代码都是实现该接口的结构才能指定。没有什么会阻止类实现接口,但那又如何?类型为IDigitalState的变量可以包含对实现该接口的类的引用,但不能作为类型为T As {Structure,IDigitalState}的通用参数传递,因此需要结构类型实现的代码不会在意可能存在此类事物。

注意,顺便说一句,该存储实现IDigitalStateIDigitalState类型的变量将有效地创建具有匹配那些结构的字段的新的类对象,以及存储该对象的引用的结构体。如果你希望确保实现一个接口的结构将像一个结构而不是一个类一样行为,你需要将它传递或保存在一个带有接口约束的泛型类型的变量中,而不是在接口类型的变量中。

以上是 限制对结构的接口只有在vb.net 的全部内容, 来源链接: utcz.com/qa/262939.html

回到顶部