[英]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.