Using the Type Constraint Type constraints allow you to associate a minimal type with the generics parameter。 For example; suppose this interface is defined: Interface IExample Sub Method() End Interface Adding an IExample constraint to the generics parameter allows you to define a class as follows: Class ExampleMgr(Of DataType As { IExample}) Private _inst As DataType Public Sub New(ByVal inst As DataType) _inst = inst End Sub Public Sub DoSomething() _inst。Method() End Sub End Class In the example; the constraint of IExample allows a developer to call Method()。 If the constraint were not there; the reference to Method would generate a piler error; because Method() is not a method of DataType。 But is this ability to reference a method an advantage? After all; you could write the ExampleMgr code without using generics; like this: …………………………………………………………Page 446…………………………………………………………… 424 CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C TE C H N IQ U E S Class ExampleMgr Dim _inst As IExample Public Sub New(ByVal inst As IExample) Me。_inst = inst End Sub Public Sub DoSomething() _inst。Method() End Sub End Class The generics code and the interface…based code do the exact same thing; and using generics offers no advantage in this example。 But that is not always the case。 Consider the following modified example of ExampleMgr。 Class ExampleMgr(Of DataType As { IExample }) Dim _inst As DataType Public Sub New(ByVal inst As IExample) Me。_inst = CType(inst; DataType) End Sub Public Sub DoSomething() _inst。Method() End Sub Public ReadOnly Property Inst() As DataType Get Return _inst End Get End Property End Class With generics; you can write a property that contains a reference to the base type。 Had you used the pure interface…based code; the Inst property would need to be of type IExample; and to get the same effect as the generics example; a cast would be involved。 A cast is not the end of the world; but it is inconvenient and not type…safe; since you don’t know if a cast will work until you execute the code。 You can add multiple interfaces and classes as constraints; although you are limited。 The limitations are identical to the limitations when subclassing a class or interface: o You can subclass only a single class。 o You can subclass as many interfaces as desired; but they must be declared after the class。 …………………………………………………………Page 447…………………………………………………………… CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C T E C HN IQ U E S 425 Using the New Constraint The purpose of the New constraint is to limit the data type to one that has a default constructor; as in this example: Class Example(Of DataType As {New}) Private _value As DataType Public Sub New() _value = New DataType() End Sub End Class Without the New constraint; the bolded code cannot be piled。 The constructor that is defined with the New constraint does not take parameters; and it would seem that this is a bother。 After all; you might want to instantiate the type with some state。 What you can do is constrain DataType; and then instantiate the type using object initial izers。 For example; the following is an interface that has a single property。 Interface IBase Property Value() As Integer End Interface bining the IBase interface and the New keyword as constraints; you could write the following code。 Class Example(Of DataType As {IBase; New}) Private _value As DataType Public Sub New() _value = New DataType() With {。Value = 10} End Sub End Class In the modified example; the bolded code instantiates DataType; and then using the constraints; the object initializer that defines _value is possible。 Using the Class Constraint The main purpose of the Class constraint is to indicate whether the generics type is a value type or a reference type。 Here is an example of a type that wants to manage only reference types: Class AssumeReferenceType(Of DataType As {Class}) Private _value As DataType Public Sub New(ByVal value As DataType) End Sub End Class …………………………………………………………Page 448…………………………………………………………… 426 CH AP T E R 1 6 ■ L E A R N I N G A B OU T O TH E R V IS U AL B A SI C TE C H N IQ U E S If you were to declare the AssumeReferenceType using an Integer; as shown in the following example; the code would not pile。 Dim cls As AssumeReferenceType(Of Integer) = _ New AssumeReferenceType(Of Integer)(Nothing) Nullable Types In ; Nothing means no value; and we all understand what it represents; right? For example; the following code shows how to use Nothing。 Dim value As Object = Nothing If value Is Nothing Then Console。WriteLine(〃Yup a Nothing〃) End If The example is obvious and does nothing useful。 If you attempted to call the Object。 ToSt