C#中的where泛型约束中的new()使用(转)
在MSDN上面對(duì)new()解釋說到是where字句的構(gòu)造函數(shù)約束,帶有new()約束的任何類型都必須有可訪問的無參構(gòu)造函數(shù),正常來說C#創(chuàng)建的類默認(rèn)都有一個(gè)無參的構(gòu)造函數(shù),即使你沒有寫,但是如果你寫了一個(gè)有參數(shù)的構(gòu)造函數(shù)后,那么就沒有默認(rèn)無參的那個(gè)了,就需要自己手動(dòng)寫一個(gè)。
還是拿前兩天的國籍那個(gè)舉個(gè)例子:
| 1 2 3 4 5 6 7 8 9 10 11 | ????/// <summary> ????/// 國籍的接口 ????/// </summary> ????public interface INationality ????{ ????????string Nationality ????????{ ????????????set; ????????} ????????string GetNationality(); ????} |
國籍的接口不用改變還是這個(gè),繼承此接口的類稍微修改了一下,為每個(gè)類增加一個(gè)構(gòu)造方法,改造如下:
| 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; ????????} ????} |
其實(shí)變動(dòng)也不大,泛型類也沒有修改,但是會(huì)報(bào)錯(cuò),在創(chuàng)建實(shí)例化對(duì)象的地方,如下:
| 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()的約束,所以編譯器編譯的時(shí)候無法通過,那么就將new()去掉,或者為繼承INationality的類增加public類型的無參構(gòu)造函數(shù) ????{ ????????//T item = new T();???? 在這個(gè)地方就不能創(chuàng)建實(shí)例化對(duì)象了,會(huì)提示錯(cuò)誤“必須有具有公共無參構(gòu)造函數(shù)的非抽象類型,才能用作泛型類型或方法"xxxx"中的參數(shù)T” ????????public void Print() ????????{ ????????????//Console.WriteLine(string.Format("Nationality:{0}", item.GetNationality())); ????????} ????} |
要解決上面的問題,就是給繼承INationality的接口的每個(gè)類都增加一個(gè)無參的public型的構(gòu)造方法,或者,將派生類后面的new()去掉。這樣的話,當(dāng)實(shí)例化泛型類的時(shí)候就不會(huì)有問題了。
上面寫那么多也是舉一個(gè)小例子,其實(shí)MSDN說的很明白,就是where字句后面有new()約束的話,T類型必須有公有的無參的構(gòu)造函數(shù)。
?
又一篇相關(guān)文章:
對(duì)于new()約束,大家可能有一個(gè)誤解,以為使用了new約束之后,在創(chuàng)建對(duì)象時(shí)與非泛型的版本是一致的:
?public class Tester<T>?where T:new() ???
{????????
public Tester() ???????
{ ???????????
t = new T();//等同于非泛型版本的new? 例如 object o = new object();? ???????
}
?????private T t;
??? }
事實(shí)上,使用new關(guān)鍵字的作用只是讓編譯器在泛型實(shí)例化之處,檢查所綁定的泛型參數(shù)T是否具有公共無參構(gòu)造函數(shù)(public?無參構(gòu)造函數(shù)):
?Tester<SomeType> t = new Tester<SomeType>(); //此處編譯器會(huì)檢查SomeType是否具有無參構(gòu)造函數(shù)。若沒有則會(huì)有compile error。
而Tester<T>類的構(gòu)造函數(shù)中的new代碼,實(shí)際上等同于下面的代碼:
?public class Tester<T> where T:new() ???
{ ???????
?????? public Tester() ???????
??????? { ???????????
????????????? t = System.Activator.CreateInstance<T>(); ???????
??????? }
????????private T t;
??? }
也就是說,仍然是用反射機(jī)制來獲取泛型對(duì)象的實(shí)例的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/shanfeng/p/5594590.html
總結(jié)
以上是生活随笔為你收集整理的C#中的where泛型约束中的new()使用(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反射,hashlib模块,正则匹配,冒泡
- 下一篇: 史上最详细 纯CSS打造3D文本滚动