日落20190523003 - C#基礎之泛型與約束

環境

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章