通用泛型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.ToString
。GetHashCode
、GetType
和Equals
也是如此。但是,ToUpper
是不允许的,其他特定于字符串的方法也是不允许的。这可以改变吗?
当我放置一个不允许的方法时,这就是我得到的错误:
错误1"ConnectionServiceT"不包含的定义"connect"且没有接受第一个参数的扩展方法"connect未能找到类型为"ConnectionServiceT"的(是否缺少使用指令还是程序集引用?)
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()是特定于字符串的,不适用于字符串以外的类型。
这可以改变吗?
您不知道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
。
ToString、GetHashCode、GetType都是属于对象类的方法以及从中继承的任何方法