所以我有这个测试程序:
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&#39; ConnectionServiceT&#39;不包含的定义 &#39;连接&#39;没有扩展方法&#39; connect&#39;接受第一个论点 类型&#39; ConnectionServiceT&#39;可以找到(你错过了使用 指令或程序集引用?)
答案 0 :(得分:2)
不允许使用方法ToUpper()
是合理的,因为这是一种特定于字符串类型的方法。如果您的类型不是字符串,则不能使用ToUpper()
方法,因为此方法特定于字符串类型。
另一方面,由于所有类型都继承了对象类型,因此它们继承了它的方法,即ToString()
,GetHashCode()
,GetType()
和Equals()
。
This是关于C#继承的一个很好的链接,在那里你可以更全面地看到我在说什么。
同样here表示:
在C#的统一类型系统中,所有类型,预定义和用户定义的引用类型和值类型都直接或间接地从Object继承。
答案 1 :(得分:2)
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/en-us/library/d5x73970.aspx
答案 2 :(得分:0)
.ToString()适用于所有类型。如果类型不是字符串,则将返回类型的名称。 .ToUpper()是一个特定于字符串的,不能在字符串以外的类型上工作。
答案 3 :(得分:0)
可以改变吗?
您不知道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();
}
}
约束为给定类型的子类:
BaseService
然后您可以在T
的实例上调用特定于T
的方法(因为您知道BaseService
必须来自string
。< / p>
但是你不能约束derp<string, string>
,因为它已被封存 - 唯一可能的类是{{1}}所以没有理由使用泛型。
答案 4 :(得分:0)
你不能使用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是属于object class的所有方法以及从中继承的任何方法。