日落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节

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