在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where
上下文关键字指定的。下表列出了六种类型的约束:
T:结构
|
类型参数必须是值类型。可以指定除 Nullable
以外的任何值类型.
|
T:类
|
类型参数必须是引用类型,包括任何类、接口、委托或数组类型。
|
T:new()
|
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()
约束必须最后指定。
|
T:<基类名>
|
类型参数必须是指定的基类或派生自指定的基类。
|
T:<接口名称>
|
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
|
T:U
|
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。
|
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Collections;
using
System.Runtime.Serialization;
namespace
DictionaryGrammar
{
public
class
WhereUse
{
public
static
void
Main()
{
//
未设置泛型构造函数时
//
MyDictionarySecond<int, Comparer> mds = new MyDictionarySecond<int, Comparer>();
//
设置了带有参数的泛型构造函数
//
demo
MyDictionaryDefault<MyCompare> mdd = new
MyDictionaryDefault<MyCompare>(new
MyCompare());
mdd.PrintString();
//
demo
MyDictionaryU<Comparer, IComparer> aa = new
MyDictionaryU<Comparer, IComparer>();
}
}
///
<summary>
///
约束泛型类型
///
</summary>
///
<typeparam name="T">
T被约束为结构类型
</typeparam>
///
<typeparam name="U">
U被约束为类
</typeparam>
public
class
MyDictionary<T, U>
where
T : struct
where
U : class
{
}
///
<summary>
///
T被限制为U类型或继承自U类型
///
</summary>
///
<typeparam name="T">
T被限制为U类型或继承自U类型
</typeparam>
///
<typeparam name="U">
U被约束为类
</typeparam>
public
class
MyDictionaryU<T, U>
where
T : U
where
U : class
{
}
///
<summary>
///
多重约束
///
</summary>
///
<typeparam name="T">
U被约束为结构
</typeparam>
///
<typeparam name="U">
U必须实现IComparer, ISerializable两个接口
</typeparam>
public
class
MyDictionarySecond<T, U>
where
T : struct
where
U : IComparer, ISerializable
{
}
///
<summary>
///
设置默认构造函数
///
<remarks>
///
new约束指定泛型类声明中的任何类型参数都必须具有公共的无参数构造函数
///
</remarks>
///
</summary>
///
<typeparam name="T"></typeparam>
public
class
MyDictionaryDefault<T>
where
T : IComparer, new
()
{
///
<summary>
///
泛型的构造函数,由于设置了默认参数,所以在使用此泛型时,必须要传入参数。
///
</summary>
///
<param name="tVar"></param>
public
MyDictionaryDefault(T tVar)
{
Console.WriteLine("
调用泛型构造函数,类型为{0}
"
, this
.GetType());
}
///
<summary>
///
泛型中方法
///
</summary>
public
void
PrintString()
{
Console.WriteLine("
Use Default T
"
);
}
}
//
自定义类
public
class
MyCompare : IComparer
{
//
public MyCompare()
//
{
//
}
///
/如果要实现带参数的构造函数,必须要明文写出无参构造函数
//
public MyCompare(string aa)
//
{
//
}
public
int
Compare(object
x, object
y)
{
if
(x == y)
{
return
0
;
}
else
{
return
-1
;
}
}
}
}
分享到:
相关推荐
C# where泛型约束测试代码
C#泛型,非泛型实现枚举功能,通过实现接口方法或者使用迭代器块实现
where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。1.接口约束。例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口: 代码如下:public class...
1.引用类型约束 struct RefSample<T> where T:class 引用类型用Class表示约束,其他的引用类型为具体的约束。 表示对于的约束必须为一个类(引用类型)不能是值类型(int,char,datatime,struct),可以是接口...
访问修饰符 返回类型 泛型方法名 (T 参数)1):无法在泛型方法内部给任何 T 类型创建实例的对象,因为在泛型方法内部不知道传进来的对象有哪些构造函数2):约束是对内部的!(对于泛型方法)约束也是会被继承的!3...
C# 泛型 为什么使用泛型 泛型类实例化的理论 泛型类的不同的封闭类是分别不同的数据类型 泛型类中数据类型的约束 泛型方法 静态构造函数 方法重载 使用范围
常用约束 约束告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。 如果客户端代码使用不满足约束的类型...
本文讨论泛型处理的问题空间、它们的实现方式、该编程模型的好处,以及独特的创新(例如,约束、一般方法和委托以及一般继承)。此外,本文还讨论 .NET Framework 如何利用泛型。
本文以实例形式讲述了C#泛型的用法,有助于读者深入理解C#泛型的原理,具体分析如下: 首先需要明白什么时候使用泛型: 当针对不同的数据类型,采用相似的逻辑算法,为了避免重复,可以考虑使用泛型。 一、针对类的...
泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“<>”内。泛型类型参数命名建议:(1)当泛型类型参数为单个字母...泛型约束分
本文讨论泛型处理的问题空间、它们的实现方式、该编程模型的好处,以及独特的创新(例如,约束、一般方法和委托以及一般继承)。此外,本文还讨论 .NET Framework 如何利用泛型。
本文讨论泛型处理的问题空间、它们的实现方式、该编程模型的好处,以及独特的创新(例如,约束、一般方法和委托以及一般继承)。此外,本文还讨论 .NET Framework 如何利用泛型。
泛型,无论在Java中还是在C#中,应用都很广泛,可以解决很多关于类型的问题
目录 1. 泛型简介 2 1.1.理解泛型 2 1.2.泛型简介 3 2.泛型的优点 3 ...4.类型参数的约束 5 5.泛型类 9 6.泛型接口 11 7.泛型方法 13 8.泛型委托 15 9.泛型代码中的默认关键字 17 10.泛型和属性 18
在2005年底微软公司正式发布了C# 2.0,与C# 1.x相比,新版本增加了很多新特性,其中最重要的是对泛型的支持。通过泛型,我们可以定义类型安全的数据结构,而无需使用实际的数据类型。这能显著提高性能并得到更高质量...
本文讨论泛型处理的问题空间、它们的实现方式、该编程模型的好处,以及独特的创新(例如,约束、一 托以及一般继承)。此外,本文还讨论 .NET Framework 如何利用泛型。