在MSDN上面对new()解释说到是where字句的构造函数约束,带有new()约束的任何类型都必须有可访问的无参构造函数,正常来说C#创建的类默认都有一个无参的构造函数,即使你没有写,但是如果你写了一个有参数的构造函数后,那么就没有默认无参的那个了,就需要自己手动写一个。

还是拿前两天的国籍那个举个例子:

1
2
3
4
5
6
7
8
9
10
11

    /// <summary>
    /// 国籍的接口
    /// </summary>
    public interface INationality
    {
        string Nationality
        {
            set;
        }
        string GetNationality();
    }

国籍的接口不用改变还是这个,继承此接口的类稍微修改了一下,为每个类增加一个构造方法,改造如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

    /// <summary>
    /// 中国人
    /// </summary>
    public class Chinese : INationality
    {
        public Chinese(string DefaultNationality)
        {
            _Nationality = DefaultNationality;
        }
        private string _Nationality;
        public string Nationality
        {
            set
            {
                _Nationality = value;
            }
        }
        public string GetNationality()
        {
            return string.IsNullOrEmpty(_Nationality) ? "Chinese." : _Nationality;
        }
    }
    /// <summary>
    /// 美国人
    /// </summary>
    public class American : INationality
    {
        public American(string DefaultNationality)
        {
            _Nationality = DefaultNationality;
        }
        private string _Nationality;
        public string Nationality
        {
            set { _Nationality = value; }
        }
        public string GetNationality()
        {
            return string.IsNullOrEmpty(_Nationality) ? "American." : _Nationality;
        }
    }

其实变动也不大,泛型类也没有修改,但是会报错,在创建实例化对象的地方,如下:

1
2
3
4
5
6
7
8
9
10
11
12

    /// <summary>
    ///
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PrintNationality<T> where T : INationality, new()//由于此处有new()的约束,所以编译器编译的时候无法通过,那么就将new()去掉,或者为继承INationality的类增加public类型的无参构造函数
    {
        //T item = new T();     在这个地方就不能创建实例化对象了,会提示错误“必须有具有公共无参构造函数的非抽象类型,才能用作泛型类型或方法"xxxx"中的参数T”
        public void Print()
        {
            //Console.WriteLine(string.Format("Nationality:{0}", item.GetNationality()));
        }
    }

要解决上面的问题,就是给继承INationality的接口的每个类都增加一个无参的public型的构造方法,或者,将派生类后面的new()去掉。这样的话,当实例化泛型类的时候就不会有问题了。

上面写那么多也是举一个小例子,其实MSDN说的很明白,就是where字句后面有new()约束的话,T类型必须有公有的无参的构造函数。

又一篇相关文章:

对于new()约束,大家可能有一个误解,以为使用了new约束之后,在创建对象时与非泛型的版本是一致的:
 public class Tester<T> where T:new()

{

public Tester()

{

  t = new T();//等同于非泛型版本的new? 例如 object o = new object();?

}

private T t;

}
事实上,使用new关键字的作用只是让编译器在泛型实例化之处,检查所绑定的泛型参数T是否具有公共无参构造函数(public 无参构造函数):

Tester<SomeType> t = new Tester<SomeType>(); //此处编译器会检查SomeType是否具有无参构造函数。若没有则会有compile error。

而Tester<T>类的构造函数中的new代码,实际上等同于下面的代码:
 public class Tester<T> where T:new()

{

public Tester()

{             

t = System.Activator.CreateInstance<T>();

}

private T t;

}
也就是说,仍然是用反射机制来获取泛型对象的实例的。

转载于:https://www.cnblogs.com/shanfeng/p/5594590.html

C#中的where泛型约束中的new()使用(转)相关推荐

  1. java 类 方法 带泛型_java中的泛型类和泛型方法

    1.泛型是什么? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类. 可以在集合框架(Collection fram ...

  2. java中什么时候不能用泛型_java中泛型的正确使用姿势

    image.png 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.利用好泛型,在系统架构中是一把利器. 泛型类 先看一个例子,restful架构中,需要定义api接口返回 ...

  3. mysql如何删除列中的约束_我们如何从现有MySQL表的列中删除NOT NULL约束?

    我们可以使用ALTER TABLE语句从现有表的列中删除NOT NULL约束. 示例 假设我们有一个表" test123",对列" ID"具有NOT NULL约 ...

  4. 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引

    MySQL无法删除外键约束中所需的索引 我需要更改现有数据库以添加列. 因此,我还想更新UNIQUE字段以包含该新列. 我试图删除当前索引但仍然收到错误MySQL Cannot drop index ...

  5. 扩展方法必须在非泛型静态类中定义

    扩展方法必须在非泛型静态类中定义: public class CustomerHelperClass{public static MvcHtmlString CreateImage(string p_ ...

  6. 归纳偏置是什么?从现实生活中观察到的现象中归纳出一定的规则,然后对模型做一定的约束,从而可以起到“模型选择”的作用

    归纳偏置在机器学习中是一种很微妙的概念:在机器学习中,很多学习算法经常会对学习的问题做一些假设,这些假设就称为归纳偏置(Inductive Bias). 归纳偏置这个译名可能不能很好地帮助理解,不妨拆 ...

  7. Homework 1_SQL Server中由于外键约束而删除数据失败

    SQL Server中由于外键约束而删除数据失败 原因分析:外键约束问题.在配置文件中配置了一对一的关系,外键也是唯一的.数据库中数据有严格的依赖关系. 而在业务逻辑中,在往数据库里删除数据之前,却忘 ...

  8. (44)System Verilog 类中变量随机激励约束

    (44)System Verilog 类中变量随机激励约束 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机激励约束 5) ...

  9. (45)System Verilog 类中变量随机激励约束语法

    (45)System Verilog 类中变量随机激励约束语法 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机激励约束语 ...

最新文章

  1. [20171225]查看并行执行计划注意的问题.txt
  2. Foundation 框架 归档
  3. 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns
  4. 笔记 VRRP基本原理 主备备份 负载均衡
  5. java wate_Trapping Rain Water leetcode java
  6. marquee滚动起始位置_巧用喵影关键帧制作滚动水印,让视频小偷无可盗
  7. Java命令学习系列(四)——jstat
  8. 微软sql服务器开机自启,使用 SQL Server 服务启动选项
  9. 【渝粤教育】国家开放大学2019年春季 8680电工电子技术 参考试题
  10. 【转】Android 平台下使用 i2c-tools
  11. 汽车芯片格局重构「众生相」,各路玩家「各怀心事」
  12. 顶级 Java 源码教程项目大汇总
  13. Unity中使用TextMeshPro打出Emoji表情
  14. Vue含表情评论回复组件
  15. android通过webview调起支付宝app支付
  16. 展望下未来的计算机400字,展望未来作文400字(精选8篇)
  17. 安装Mosquitto学习MOTT协议
  18. IntelliJ IDEA Ultimate 安装激活
  19. 【步态识别】GLN 算法学习《Gait Lateral Network: Learning Discriminative and Compact Representations for Gait R》
  20. 学好C++可以从事哪些领域的开发

热门文章

  1. 第三十五讲:tapestry Ajax zone组件无黄色闪烁的背景
  2. InstallShield Premier版本和Professional版本的功能差异
  3. mysql的左连接应用
  4. GenericUDTF使用流程记载(转载+自己整理)
  5. ajax请求flask以后得到的响应查看
  6. 快速筛选数据集中某列特征符合某种规律的所有数据集
  7. 特征向量按照特征值大小进行排序
  8. python测试代码运行时间_python测量代码运行时间方法
  9. android root 挂载分区,adb — adb disable-verity, adb remount 实现重新挂载system分区为可读写分区...
  10. 迪普科技以近50%份额全面中标国家电网2016信息化硬件采购