Q:
What's wrong with the below generic class?
VB.NET
Imports
System.Data
Imports
System.Web
Public
Class
GenericClass(
Of
T
As
DataTable)
Public
Function
GetValue(
ByVal
val
As
T)
As
T
Return
val
End
Function
Public
Function
GetValue(
ByVal
val
As
T)
As
DataTable
Return
val
End
Function
Public
Sub
GetValue(
ByVal
val
As
T)
HttpContext.Current.Response.Write(val)
End
Sub
End
Class
C#
using
System.Data;
using
System.Web;
public
class
GenericClass
where
T :
DataTable
{
public
T GetValue(T val)
{
return
val;
}
public
DataTable
GetValue(T val)
{
return
val;
}
public
void
GetValue(T val)
{
HttpContext
.Current.Response.Write(val);
}
}
A:
At first glance, the overloaded methods appear to be unique. However, this is not the case. In VB.NET, the first 2 methods would error and in C# the last 2 methods would error. Why does this happen? Like non-generic methods, your generic methods must be unique by their method signatures, not just by their return types.
In generics, you can use sub classes just as you would any non-generic sub class. Take the following class and sub class for example:
VB.NET
Public Class
OuterClass(
Of
T, U, V)
Public Class
InnerClass(
Of
T, U)
Public Function
InnerMethod(
ByVal
val1
As
T,
ByVal
val2
As
U)
As
V
' Some code here
End Function
End Class
End Class
C#
public class
OuterClass
{
public class
InnerClass
{
public
V InnerMethod(T val1, U val2)
{
// Some code here
}
}
}
The above code is perfectly legal and will compile. The question is which class will T and U in InnerMethod inherit its type references from? The answer is the class which the method is contained in, in the case of the example provided above, InnerClass. However, you should never name the types of a sub class the same as those of the class it is contained in. If you get in the habbit of using strongly named types, you will avoid possible future problems.