繁体   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