zoukankan      html  css  js  c++  java
  • C#中的where泛型约束中的new()构造函数约束

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

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

     1 /// <summary>
    2 /// 国籍的接口
    3 /// </summary>
    4 public interface INationality
    5 {
    6 string Nationality
    7 {
    8 set;
    9 }
    10 string GetNationality();
    11 }

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

     1 /// <summary>
    2 /// 中国人
    3 /// </summary>
    4 public class Chinese : INationality
    5 {
    6 public Chinese(string DefaultNationality)
    7 {
    8 _Nationality = DefaultNationality;
    9 }
    10 private string _Nationality;
    11 public string Nationality
    12 {
    13 set
    14 {
    15 _Nationality = value;
    16 }
    17 }
    18
    19 public string GetNationality()
    20 {
    21 return string.IsNullOrEmpty(_Nationality) ? "Chinese." : _Nationality;
    22 }
    23 }
    24
    25 /// <summary>
    26 /// 美国人
    27 /// </summary>
    28 public class American : INationality
    29 {
    30 public American(string DefaultNationality)
    31 {
    32 _Nationality = DefaultNationality;
    33 }
    34 private string _Nationality;
    35 public string Nationality
    36 {
    37 set { _Nationality = value; }
    38 }
    39
    40 public string GetNationality()
    41 {
    42 return string.IsNullOrEmpty(_Nationality) ? "American." : _Nationality;
    43 }
    44 }

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

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

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

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


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





  • 相关阅读:
    hdu 4813(2013长春现场赛A题)
    NEFU 628 Garden visiting (数论)
    FZU 2020 组合 (Lucas定理)
    HDU 3304 Interesting Yang Yui Triangle (Lucas定理)
    HDU 3037 Saving Beans (数论,Lucas定理)
    UVa 1161 Objective: Berlin (最大流)
    Vijos P1951 玄武密码 (AC自动机)
    LA 4670 Dominating Patterns (AC自动机)
    HDU 2340 Obfuscation (暴力)
    HDU 5510 Bazinga (KMP)
  • 原文地址:https://www.cnblogs.com/luacloud/p/2269056.html
Copyright © 2011-2022 走看看