通用泛型c#

本文关键字:泛型 | 更新日期: 2023-09-27 17:57:52

所以我有这个测试程序:

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.ToStringGetHashCodeGetTypeEquals也是如此。但是,ToUpper是不允许的,其他特定于字符串的方法也是不允许的。这可以改变吗?

当我放置一个不允许的方法时,这就是我得到的错误:

错误1"ConnectionServiceT"不包含的定义"connect"且没有接受第一个参数的扩展方法"connect未能找到类型为"ConnectionServiceT"的(是否缺少使用指令还是程序集引用?)

通用泛型c#

top.ToString是允许的。还允许使用GetHashCode、GetType和Equals。

但是,不允许使用ToUpper,也不允许使用其他特定于字符串的方法。这可以改变吗?

这很正常。编译器对T的实际类型一无所知,因此不能假设它有ToUpper方法。但是,由于所有类型(指针除外)都继承自Object,因此允许调用Object类的方法。

现在,如果T上有一个约束,强制它继承一个具有ToUpper方法的类型,那么您的代码就可以工作了:

class derp<T,V> where T : String

这是一个糟糕的例子,因为String是密封的,所以这段代码不会编译,但这只是为了说明这个想法。

无论如何,如果您希望能够在top上调用String.ToUpper方法,那么top的类型不能是泛型的:它必须String

要了解有关通用约束的更多信息,请参阅MSDN:http://msdn.microsoft.com/en-us/library/d5x73970.aspx

不允许使用方法ToUpper()是合理的,因为这是一个特定于字符串类型的方法。如果您的类型不是字符串,则不能使用ToUpper()方法,因为该方法特定于字符串类型。

另一方面,由于所有类型都属于对象类型,因此它们继承了对象类型的方法,即ToString()GetHashCode()GetType()Equals()

这是关于C#中继承的一个很好的链接,在这里你可以更彻底地了解我所说的内容。

这里还指出:

在C#的统一类型系统中,所有类型,预定义的和用户定义的,引用类型和值类型,都直接或间接继承自Object。

.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都是属于对象类的方法以及从中继承的任何方法