C#通用方法和调用方式

时间:2016-07-09 15:45:21

标签: c# generics generic-list

static List<T> GetInitializedList<T>(T value, int count)
{ 
    List<T> list = new List<T>();   

    for (int i = 0; i < count; i++)
    {
       list.Add(value); 
    }
    return list;
}

以上显示的通用方法可以如下调用...

EX-1

List<bool> list1 = GetInitializedList(true, 5);

EX-2

List<string> list2 = GetInitializedList<string>("Perls", 3);

我想知道使用EX-1和EX-2

调用这些通用方法之间的区别

调用genric方法的最有效/标准/最佳方式是什么。

EX-1或EX-2

3 个答案:

答案 0 :(得分:7)

他们是等同的。基本上,如果您没有为方法指定类型参数(即方法调用中<>中的类型),编译器将尝试使用类型推理根据实际参数(方法调用中()中的表达式)计算出您所指的类型参数。

当编译器推断出你想要的类型参数时,他们编译为完全相同的代码。在某些情况下,您需要在以下情况下指定类型参数:

  • 编译器无法推断出类型。例如:

    GetInitializedList<string>(null, 5);
    

    此处编译器无法推断类型参数,因为null没有类型。

  • 编译器推断出的类型不是你想要的。例如:

    List<object> objects = GetInitializedList<object>("foo", 5);
    

    这里编译器会推断string的类型参数,这不是我们想要的。

答案 1 :(得分:2)

没有区别,第二种方式有冗余指定类型。编译器已经尝试从参数中推断出类型。

当你写:

List<string> list2 = GetInitializedList("Perls", 3);

编译器推断T是字符串,因为参数value的类型是字符串。

在最新版本的Visual Studio中,IDE建议您在编译器能够推断出类型时删除<string>

除非编译器无法推断出类型,否则您不需要使用第二种方法。例如:

public void GenericMethod<T>()
{

}

这里你强制指定类型,因为没有参数,编译器可以从中推断出类型。

这不会编译:

GenericMethod();

这将编译:

GenericMethod<string>();

在其他情况下,编译器无法推断出类型。所以你必须明确指定它。

答案 2 :(得分:1)

没有区别,在这两种情况下你真正拥有的是后一版本。

第一个是可能的,因为编译器推断泛型参数,这意味着虽然省略了参数,但编译器就像参数一样。