2015-12-11 96 views
0

的原因是两者之间有什么区别。什么是我定义泛型类型T.泛型类和泛型方法,什么是定义类泛型类在下面的例子

的理由,如果我只定义方法意思一样定义类类型T的

void Main() 
{ 
    Test1<int> x = new Test1<int>(); 
    x.Test1Method(1); 

    Test2 x1 = new Test2(); 
    x1.Test2Method(1); 
} 

public class Test1<T> 
{ 
    public void Test1Method<T>(T x) 
    { 
     Console.WriteLine(x); 
    } 
} 

public class Test2 
{ 
    public void Test2Method<T>(T x) 
    { 
     Console.WriteLine(x); 
    } 
} 
+1

是否'Test1'有任何其他的方法? “Test1Method”的类型参数隐藏类的类型参数。 – Lee

+1

你'Test1'类应该是给你编译器有关使用相同的名称为一个通用的参数作为一个已定义的警告。 –

+0

我看到你的球员点,但随后如果我只是定义与类型TI类几乎可以做一切我能做[如果我定义的通用方法],当我会去的泛型类和泛型方法 – loneshark99

回答

1

这是不一样的,但是当你有一个泛型类型(其中,当类本身是通用的,你只能做)的属性/字段中的差别仅仅是显而易见的,或者你有多种方法:在类

public class ArrayWrapper<T> { 
    private T[] elements; 

    public T get(int index) { 
     return elements[index]; 
    } 

    public void set(int index, T value) { 
     elements[index] = value; 
    } 
} 

没有<T>中, T[] elements字段不会编译乐,并有可能在get()set()同一对象使用不同的类型。 (正如Lee指出的那样,当你在类上使用方法时,你可能不想使用<T>,因为它在两个地方都会为该方法实际引入另一个泛型类型参数,而该方法独立于一类用于该类...)

+0

我明白你的意思但如果我只是用TI类定义类,几乎可以做任何我可以做的事情[如果我已经定义了泛型方法],那么我什么时候才能使用泛型类和泛型方法。 – loneshark99

+1

这取决于您是否希望/需要将方法的类型连接在一起,以及您是否需要/需要通用字段或属性。在我的示例中,这些都是必需的,但在其他情况下,您可能需要使用独立类型的方法(但这种方法不太常见,而且更经常使用包含静态实用程序方法的类)。 –

1

在类Test1中,在类级别上定义的T与在Test1Method方法上定义的T不同。这使得课堂上的T无用。

您可以使用Test1这样的:

Test1<string> x = new Test1<string>(); 
x.Test1Method(1); 

在这种情况下,第一Tstring和第二T为int。

因为它是现在,Test1没有比Test2不同。

这本来是不同的,如果你定义Test1这样的:这种变化Test1Method怎么没有一个通用的T参数后

public class Test1<T> 
{ 
    public void Test1Method(T x) 
    { 
     Console.WriteLine(x); 
    } 
} 

通知。现在这门课不同于Test2,因为在Test1中,您在对象构造时指定了T,而在Test2中,每次调用Test2Method时可以有不同的T

这里是你如何使用(变更后我介绍)这两个类的例子:

Test1<int> x = new Test1<int>(); 
x.Test1Method(1); //valid 
x.Test1Method(2); //valid 
x.Test1Method("str"); //invalid 

Test2 x1 = new Test2(); 
x1.Test2Method(1); //valid 
x1.Test2Method("str"); //valid