環境
系統: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節