环境
系统:Windows 10
引擎:VS2017
笔记
(1)约束的作用
如果没有约束,泛型能做的事就只有赋值和调用一下Object定义的几个方法。
→ 古有千里马遇伯乐,今有泛型遇约束。
(2)虚泛型方法
重写虚泛型方法时,不允许指定约束,因为只能继承原方法的约束。
→ 继承者们
(3)主要约束的指定
没有指定主要约束,即默认为System.Object,但如果显示指定System.Object,就会报错error CS0702。
→ 傲娇
实例
约束关键字
using System;
namespace GenericsConstraintTest
{
class Program
{
// 主要约束为值类型
internal sealed class PrimaryConstraintOfClass<T> where T : class
{
public static T Method()
{
return null;
}
}
// 主要约束为引用类型
internal sealed class PrimaryConstraintOfStruct<T> where T : struct
{
public static T Method()
{
return new T();
}
}
// 做一个无参构造器约束,能通用于值类型和引用类型(but,只限于具有无参构造函数的引用类型)
internal sealed class ConstructorConstraint<T> where T : new()
{
public static T Method()
{
return new T();
}
}
static void Main(string[] args)
{
var a1 = PrimaryConstraintOfClass<Object>.Method();
var a2 = PrimaryConstraintOfClass<String>.Method();
var b1 = PrimaryConstraintOfStruct<Int32>.Method();
var c1 = ConstructorConstraint<Object>.Method();
var c2 = ConstructorConstraint<String>.Method(); // 编译错误,构造器约束现在只用于无参构造函数,而String没有无参构造函数。
var d1 = ConstructorConstraint<Int32>.Method();
}
}
}
以上简单回顾。
参考资料:
《CLR via C#(第3版)》第12.9节