C#泛型类、泛型函数
泛型⽅法是使⽤类型参数声明的⽅法,如下所⽰:
C#
static void Swap<T>(ref T lhs, ref T rhs)writeline函数
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
下⾯的代码⽰例演⽰⼀种使⽤ int 作为类型参数的⽅法调⽤⽅式:
C#
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
也可以省略类型参数,编译器将推断出该参数。下⾯对 Swap 的调⽤等效于前⾯的调⽤:
C#
Swap(ref a, ref b);
相同的类型推断规则也适⽤于静态⽅法以及实例⽅法。编译器能够根据传⼊的⽅法参数推断类型参数;它⽆法仅从约束或返回值推断类型参数。因此,类型推断不适⽤于没有参数的⽅法。类型推断在编译时、编译器尝试解析任何重载⽅法签名之前进⾏。编译器向共享相同名称的所有泛型⽅法应⽤类型推断逻辑。在重载解析步骤中,编译器仅包括类型推断取得成功的那些泛型⽅法。
在泛型类中,⾮泛型⽅法可以访问类级别类型参数,如下所⽰:
C#
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
如果定义的泛型⽅法接受与包含类相同的类型参数,编译器将⽣成警告 CS0693,因为在⽅法范围内,为内部 T 提供的参数将隐藏为外部T 提供的参数。除了类初始化时提供的类型参数之外,如果需要灵活调⽤具有类型参数的泛型类⽅法,请考虑为⽅法的类型参数提供其他标识符,如下⾯⽰例中的 GenericList2<T> 所⽰。
C#
class GenericList<T>
{
// CS0693
void SampleMethod<T>() { }
}
class GenericList2<T>
{
//No warning
void SampleMethod<U>() { }
}
使⽤约束对⽅法中的类型参数启⽤更专门的操作。此版本的 Swap<T> 现在称为 SwapIfGreater<T>,它只能与实现 IComparable<T> 的类型参数⼀起使⽤。
C#
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T> {
T temp;
if (lhs.CompareTo(rhs) > 0)
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
泛型⽅法可以使⽤许多类型参数进⾏重载。例如,下列⽅法可以全部存在于同⼀个类中: C#
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。