[英]General Generics c#
所以我有這個測試程序:
namespace ConsoleApplication1TEST{
class Program
{
static void Main(string[] args)
{
new derp<int,int>(5,4);
}
}
class derp<T,V>
{
public T top;
public V vop;
public derp(T to, V vo)
{
top = to;
vop = vo;
top.ToString();
}
}
}
top.ToString
是允許的。 以及GetHashCode
, GetType
和Equals
。 但是,不允許ToUpper
,其他字符串特定的方法也不允許。 可以更改嗎?
當我放置不允許的方法時,這是我得到的錯誤:
錯誤1'ConnectionServiceT'不包含'connect'的定義,也找不到擴展方法'connect'接受類型為'ConnectionServiceT'的第一個參數(您是否缺少using指令或程序集引用?)
top.ToString是允許的。 還允許使用GetHashCode,GetType,Equals。
但是,不允許ToUpper,也不允許其他特定於字符串的方法。 可以更改嗎?
那是完全正常的。 編譯器對T
的實際類型一無所知,因此不能假定它具有ToUpper
方法。 但是,由於所有類型(指針除外)都繼承自Object
,因此允許使用Object
類的調用方法。
現在,如果對T
施加了約束,以強制其繼承具有ToUpper
方法的類型,則您的代碼將起作用:
class derp<T,V> where T : String
這是一個不好的例子,因為String
是密封的,所以該代碼不會被編譯,但這只是為了說明這個想法。
無論如何,如果你希望能夠調用String.ToUpper
的方法top
,然后類型top
不能通用:它必須是String
。
要了解有關通用約束的更多信息,請參見MSDN: http : //msdn.microsoft.com/zh-cn/library/d5x73970.aspx
.ToString()適用於每種類型。 如果類型不是字符串,則將返回類型名稱。 .ToUpper()是特定於字符串的,不適用於字符串以外的類型。
可以更改嗎?
您不知道T
和V
是什么,因此編譯器可以做出的唯一假設是它們從object
繼承,這就是為什么允許ToString
, GetHashCode
, GetType
和Equals
原因(因為它們是object
方法, 每個類都是繼承自)。
如果ConnectionServiceT
(和其他類似的類)從基類繼承,則可以將T
和V
約束為給定類型的子類:
class derp<T,V> where T:BaseService
where V:MyOtherClass
{
public T top;
public V vop;
public derp(T to, V vo)
{
top = to;
vop = vo;
top.ToString();
}
}
然后,您可以在T
實例上調用特定於BaseService
方法(因為您知道T
必須從BaseService
派生。
但是您不能約束string
因為它是密封的-唯一可能的類是derp<string, string>
因此沒有理由使用泛型。
不能使用T oUpper()
是一件好事。 您正在發送整數,但這些肯定沒有ToUpper方法。 ToUpper是屬於字符串對象的方法。 您可以這樣做:
string myUpperCaseString = top.ToString().ToUpper();
//or
if(top.GetType() == typeof(string)
{
string myUpperCaseString = (top as string).ToUpper();
}
您可能會誤會的是, ToString()
不會更改字符串...而是返回該對象的新字符串表示形式,然后您必須將該對象存儲在某個地方。 在上面,我將其存儲在名為myUpperCaseString
的變量中,其類型為string
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.