C#中的where泛型约束中的new()使用(转)
在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()使用(转)相关推荐
- java 类 方法 带泛型_java中的泛型类和泛型方法
1.泛型是什么? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类. 可以在集合框架(Collection fram ...
- java中什么时候不能用泛型_java中泛型的正确使用姿势
image.png 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.利用好泛型,在系统架构中是一把利器. 泛型类 先看一个例子,restful架构中,需要定义api接口返回 ...
- mysql如何删除列中的约束_我们如何从现有MySQL表的列中删除NOT NULL约束?
我们可以使用ALTER TABLE语句从现有表的列中删除NOT NULL约束. 示例 假设我们有一个表" test123",对列" ID"具有NOT NULL约 ...
- 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引
MySQL无法删除外键约束中所需的索引 我需要更改现有数据库以添加列. 因此,我还想更新UNIQUE字段以包含该新列. 我试图删除当前索引但仍然收到错误MySQL Cannot drop index ...
- 扩展方法必须在非泛型静态类中定义
扩展方法必须在非泛型静态类中定义: public class CustomerHelperClass{public static MvcHtmlString CreateImage(string p_ ...
- 归纳偏置是什么?从现实生活中观察到的现象中归纳出一定的规则,然后对模型做一定的约束,从而可以起到“模型选择”的作用
归纳偏置在机器学习中是一种很微妙的概念:在机器学习中,很多学习算法经常会对学习的问题做一些假设,这些假设就称为归纳偏置(Inductive Bias). 归纳偏置这个译名可能不能很好地帮助理解,不妨拆 ...
- Homework 1_SQL Server中由于外键约束而删除数据失败
SQL Server中由于外键约束而删除数据失败 原因分析:外键约束问题.在配置文件中配置了一对一的关系,外键也是唯一的.数据库中数据有严格的依赖关系. 而在业务逻辑中,在往数据库里删除数据之前,却忘 ...
- (44)System Verilog 类中变量随机激励约束
(44)System Verilog 类中变量随机激励约束 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机激励约束 5) ...
- (45)System Verilog 类中变量随机激励约束语法
(45)System Verilog 类中变量随机激励约束语法 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog 类中变量随机激励约束语 ...
最新文章
- [20171225]查看并行执行计划注意的问题.txt
- Foundation 框架 归档
- 暴力+构造 Codeforces Round #283 (Div. 2) C. Removing Columns
- 笔记 VRRP基本原理 主备备份 负载均衡
- java wate_Trapping Rain Water leetcode java
- marquee滚动起始位置_巧用喵影关键帧制作滚动水印,让视频小偷无可盗
- Java命令学习系列(四)——jstat
- 微软sql服务器开机自启,使用 SQL Server 服务启动选项
- 【渝粤教育】国家开放大学2019年春季 8680电工电子技术 参考试题
- 【转】Android 平台下使用 i2c-tools
- 汽车芯片格局重构「众生相」,各路玩家「各怀心事」
- 顶级 Java 源码教程项目大汇总
- Unity中使用TextMeshPro打出Emoji表情
- Vue含表情评论回复组件
- android通过webview调起支付宝app支付
- 展望下未来的计算机400字,展望未来作文400字(精选8篇)
- 安装Mosquitto学习MOTT协议
- IntelliJ IDEA Ultimate 安装激活
- 【步态识别】GLN 算法学习《Gait Lateral Network: Learning Discriminative and Compact Representations for Gait R》
- 学好C++可以从事哪些领域的开发
热门文章
- 第三十五讲:tapestry Ajax zone组件无黄色闪烁的背景
- InstallShield Premier版本和Professional版本的功能差异
- mysql的左连接应用
- GenericUDTF使用流程记载(转载+自己整理)
- ajax请求flask以后得到的响应查看
- 快速筛选数据集中某列特征符合某种规律的所有数据集
- 特征向量按照特征值大小进行排序
- python测试代码运行时间_python测量代码运行时间方法
- android root 挂载分区,adb — adb disable-verity, adb remount 实现重新挂载system分区为可读写分区...
- 迪普科技以近50%份额全面中标国家电网2016信息化硬件采购