首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#泛型方法和调用方式

C#泛型方法和调用方式
EN

Stack Overflow用户
提问于 2016-07-09 23:45:21
回答 3查看 103关注 0票数 0
代码语言:javascript
复制
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

代码语言:javascript
复制
List<bool> list1 = GetInitializedList(true, 5);

EX-2

代码语言:javascript
复制
List<string> list2 = GetInitializedList<string>("Perls", 3);

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

调用通用方法的最有效的/standard /最佳方式是什么?

EX-1或EX-2

EN

回答 3

Stack Overflow用户

发布于 2016-07-09 23:47:37

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

当编译器推断出您想要的类型参数时,它们会编译成完全相同的代码。在某些情况下,如果满足以下条件,则需要指定类型参数:

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

GetInitializedList(null,5);

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

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

List objects = GetInitializedList("foo",5);

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

票数 7
EN

Stack Overflow用户

发布于 2016-07-09 23:47:16

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

当你写的时候:

代码语言:javascript
复制
List<string> list2 = GetInitializedList("Perls", 3);

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

在最新版本的Visual Studio中,如果编译器能够推断类型,集成开发环境会建议您删除<string>

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

代码语言:javascript
复制
public void GenericMethod<T>()
{

}

在这里,您必须指定类型,因为没有参数可供编译器推断类型。

这将不会编译:

代码语言:javascript
复制
GenericMethod();

这将进行编译:

代码语言:javascript
复制
GenericMethod<string>();

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

票数 2
EN

Stack Overflow用户

发布于 2016-07-09 23:48:38

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38283518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档