【问题标题】:Using List<T> in C# (Generics)在 C# 中使用 List<T>(泛型)
【发布时间】:2017-06-28 15:01:58
【问题描述】:

这是一个非常基本的问题,但我以前从未深入研究过泛型,我发现自己需要使用它。不幸的是,我现在没有时间阅读任何教程,而且到目前为止我找到的相关问题的答案都不是基本的,所以我们开始吧:

假设我有以下内容:

List<MyClass1> list1 = getListType1();
List<MyClass2> list2 = getListType2();

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);

当然

void MyMethod(List<T> list){
    //Do stuff
}

嗯,我以为会这么简单,但显然不是。 VS 警告我

无法从用法推断方法 MyMethod(System.Collections.Generic.List) 的类型参数

如果我还是编译它,我会得到一个

找不到类型或命名空间名称“T”

错误。

在我找到的许多答案中,我读到我必须声明 T 是什么,这是有道理的,但在如此简单的场景中我无法完全掌握如何做到这一点。当然,这些答案在我的脑海中产生了更多问题,但现在我只想解释我做错了什么(除了不研究泛型)以及如何改正。

【问题讨论】:

  • 一方面,确保您使用 System.Collections.Generic;包括在内。
  • 泛型不是这样工作的。 MyMethod(List&lt;T&gt; list) 是无效的方法签名(除非您的类是具有类型参数 T 的泛型类)
  • MyClass1MyClass2 有一些共同的基本类型或接口吗?它们有很多共同的属性或方法吗?

标签: c# generics


【解决方案1】:

您需要针对该方法声明T,然后C#才能识别该方法正在接收的类型。试试这个:

void MyMethod<T>(List<T> list){
    //Do stuff
}

然后调用它:

if (someCondition)
    MyMethod(list1);
else
    MyMethod(list2);

如果您要传递给该方法的所有类共享一个公共基类,您可以使其更加严格:

void MyMethod<T>(List<T> list) where T : MyClassBase

【讨论】:

  • C# 将根据参数推断类型,因此在这种情况下不需要显式指定 - 显然,如果方法上没有参数,则需要指定泛型参数 -但是当它们被推断出来时很好!
  • 所有答案都有效,我选择这个作为最完整的答案(包括@Charleh 评论和后续更新)。谢谢大家。
【解决方案2】:

您需要将T 的泛型类型参数添加到您的方法中:

void MyMethod<T>(List<T> list) {

编译器不知道T代表什么,否则。

【讨论】:

    【解决方案3】:

    你需要让c#知道发送的是什么类型:

    List<MyClass1> list1 = getListType1();
    List<MyClass2> list2 = getListType2();
    
    if (someCondition)
        MyMethod<MyClass1>(list1);
    else
        MyMethod<MyClass2>(list2);
    
    void MyMethod<T>(List<T> list){
        //Do stuff
    }
    

    【讨论】:

      【解决方案4】:

      基本上,在 C# 中,List &lt; T &gt; 类表示可以通过索引访问的强类型对象列表。

      而且它还支持存储特定类型的值,而无需转换为对象或从对象转换。

      我们可以在列表中使用Interger value & String Value。

      【讨论】:

        猜你喜欢
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多