一般仿制药c#

时间:2014-04-10 18:45:32

标签: c# generics

所以我有这个测试程序:

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&#39; ConnectionServiceT&#39;不包含的定义   &#39;连接&#39;没有扩展方法&#39; connect&#39;接受第一个论点   类型&#39; ConnectionServiceT&#39;可以找到(你错过了使用   指令或程序集引用?)

5 个答案:

答案 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)

  

可以改变吗?

您不知道TV是什么,因此编译器可以做出的唯一假设是它们继承自object,这就是为什么ToString允许使用{,GetHashCodeGetTypeEquals(因为object上的每个类都继承自的ConnectionServiceT方法。

如果T(和其他类似的类)从基类继承,您可以将Vclass 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的所有方法以及从中继承的任何方法。