簡體   English   中英

通用泛型c#

[英]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是允許的。 以及GetHashCodeGetTypeEquals 但是,不允許ToUpper ,其他字符串特定的方法也不允許。 可以更改嗎?

當我放置不允許的方法時,這是我得到的錯誤:

錯誤1'ConnectionServiceT'不包含'connect'的定義,也找不到擴展方法'connect'接受類型為'ConnectionServiceT'的第一個參數(您是否缺少using指令或程序集引用?)

不允許使用方法ToUpper() ,因為這是特定於字符串類型的方法。 如果您的類型不是字符串,則不能使用ToUpper()方法,因為該方法特定於字符串類型。

另一方面,由於所有類型都繼承對象類型,因此它們繼承了對象的方法,即ToString()GetHashCode()GetType()Equals()

是有關C#繼承的很好的鏈接,您可以在其中更全面地了解我在說什么。

這里還說:

在C#的統一類型系統中,所有類型(預定義和用戶定義的類型,引用類型和值類型)都直接或間接繼承自Object。

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()是特定於字符串的,不適用於字符串以外的類型。

可以更改嗎?

您不知道TV是什么,因此編譯器可以做出的唯一假設是它們從object繼承,這就是為什么允許ToStringGetHashCodeGetTypeEquals原因(因為它們是object方法, 每個類都是繼承自)。

如果ConnectionServiceT (和其他類似的類)從基類繼承,則可以將TV約束為給定類型的子類:

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

ToString,GetHashCode,GetType都是屬於該對象類以及從該對象類繼承的任何方法的所有方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM