C#中的where泛型约束中的new()

原文:http://www.luacloud.com/2011/where-generic-constraint-new.html


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

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

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

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

/// <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;
			}
		}

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

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

			public void Print()
			{
				//Console.WriteLine(string.Format("Nationality:{0}", item.GetNationality()));
			}
		}

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

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



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值