C# 泛型方法和调用方式

本文关键字:方式 调用 泛型方法 | 更新日期: 2023-09-27 17:56:20

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;
}

上面显示的泛型方法可以调用如下...

前-1

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

EX-2

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

我想知道使用 EX-1 和 EX-2 调用此泛型方法之间的区别

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

EX-1 或 EX-2

C# 泛型方法和调用方式

它们是等效的。基本上,如果您没有为方法指定类型参数(即方法调用中<>中的类型),编译器将尝试使用类型推断来根据实际参数(方法调用中()中的表达式)来确定您指的是哪些类型参数。

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

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

    GetInitializedList<string>(null, 5);
    

    在这里,编译器无法推断类型参数,因为null没有类型。

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

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

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

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

当你写:

List<string> list2 = GetInitializedList("Perls", 3);
编译器推断 T 是字符串

,因为参数 value 的类型是字符串。

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

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

public void GenericMethod<T>()
{
}

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

这不会编译:

GenericMethod();

这将编译:

GenericMethod<string>();

在其他情况下,编译器无法推断类型。因此,您必须显式指定它。

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

第一个之所以可能,是因为编译器推断了泛型参数,这意味着尽管省略了参数,但编译器的行为就像参数存在一样。