在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 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`关键字是用于泛型约束的重要组成部分,它允许我们对泛型类型参数施加特定的限制,确保在使用泛型类、接口或方法时,传递的类型必须满足这些约束条件。`where`泛型约束在提高代码的灵活性和...
在C#编程中,泛型和枚举是两种非常重要的概念。泛型提供了一种方式,使得代码可以处理多种数据类型,而无需为每种类型重复编写相同逻辑。枚举则是用于定义一组预定义的常量,便于表示一组相关的值。下面我们将详细...
where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。1.接口约束。例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口: 代码如下:public class...
C#泛型是一种强大的编程工具,它为C#程序员提供了更大的灵活性和性能优化。泛型在.NET Framework 2.0中被引入,旨在解决传统集合类(如ArrayList)在处理不同类型数据时存在的性能和类型安全问题。以下是关于C#泛型...
- **类型擦除**:C#泛型使用了一种称为类型擦除的技术,在编译后,所有的类型参数被替换为其实际类型,生成的IL代码中没有类型参数的概念,只有具体的类型。 - **类型约束**:在定义泛型时,可以添加类型约束,如...
5. **泛型约束**:在定义泛型类型时,可以设置约束条件,限制T可以是哪些类型。常见的约束包括: - `where T : class`:T必须是引用类型。 - `where T : struct`:T必须是值类型。 - `where T : new()`:T必须有...
为了确保泛型类型参数的正确性和适用性,C#提供了所谓的“泛型约束”机制。通过使用`where`关键字,可以在泛型声明中对类型参数添加限制条件,从而更好地控制代码的行为。 #### 1. 基础概念 在C#中,`where`关键字...
1.引用类型约束 struct RefSample<T> where T:class 引用类型用Class表示约束,其他的引用类型为具体的约束。 表示对于的约束必须为一个类(引用类型)不能是值类型(int,char,datatime,struct),可以是接口...
下面将详细探讨C#泛型集合的使用及其相关知识点。 1. **泛型接口与类** C#中的泛型接口如`IEnumerable<T>`和泛型类如`List<T>`、`Dictionary, TValue>`是泛型集合的基础。这些接口和类定义了操作数据的一般方法,...
下面将详细介绍C#泛型的应用实例。 1. **泛型类**:泛型类是在定义时未指定类型的类,如`List<T>`。`T`被称为类型参数,代表一个未知的类型。例如,我们可以创建一个名为`MyGenericClass<T>`的泛型类,其中`T`可以...
在"高级无敌,c#泛型例子"这个主题中,我们将深入探讨C#泛型的基本概念、优势以及如何实际应用。 首先,泛型是C#中引入的一种类型参数化机制。在定义类或方法时,我们可以使用类型参数(如`T`)来代替具体的类型,...
下面我们将深入探讨C#泛型接口的概念、语法以及如何在实际开发中应用。 一、泛型接口基础 1. 定义泛型接口:泛型接口通过在接口名称后添加尖括号`<T>`来声明,其中`T`是类型参数,代表一个未知的数据类型。例如: ...
此外,C#泛型还支持约束,这允许对类型参数施加额外的限制。比如,你可以要求类型参数必须实现某个接口、必须有默认构造函数或者必须是特定类型或其派生类型。这可以用来确保泛型的正确使用,如: ```csharp public ...
C#中的泛型类是编程中的一个重要概念,它允许我们创建可以处理多种数据类型的类,提高了代码的重用性和效率。下面将详细讲解泛型类的各个方面。 1. **泛型类的基本应用** 泛型类的核心在于类型参数,这使得类能够...
总的来说,C#泛型是一种强大的工具,它解决了面向对象编程中的类型安全和性能问题,增强了代码的可重用性和灵活性。理解并熟练掌握泛型是C#开发者必备的技能之一。通过泛型,开发者可以编写出更加高效、类型安全且...
C#泛型是.NET框架中的一个强大特性,它允许我们创建可重用的类型,这些类型可以在多种数据类型上工作,而无需重复编写相同代码。泛型的主要目标是提高代码的类型安全性和性能,同时减少类型转换的需要。在本文中,...
访问修饰符 返回类型 泛型方法名 (T 参数)1):无法在泛型方法内部给任何 T 类型创建实例的对象,因为在泛型方法内部不知道传进来的对象有哪些构造函数2):约束是对内部的!(对于泛型方法)约束也是会被继承的!3...
- **泛型约束**:使用 `where` 子句来约束泛型参数,确保泛型参数具有某些特性,如 `where T : struct` 或 `where T : class`。 - **3.2.8 初始化泛型类型变量为它们的默认值** - **初始化**:使用 `default(T)`...
同时,泛型约束也可以帮助开发者更好地理解和学习 C# 语言。 在实际开发中,常用的泛型约束为 where T : struct、where T : class、where T : new()。多个参数约束可以对多个参数应用多个约束,对一个参数应用多个...