List<t> 的扩展方法无法识别 class C# 的实例方法

Extension Method of List<t> not recognize Instance method of the class C#

我有一个联系人 class,我想为那个 class 的列表创建一个扩展方法,但它无法识别我的 con.GetName() 函数。 我使用了 right refernce 并且它确实识别了 class 名称,尽管它不会识别 class

的实例方法
public static string ToString (this List<Contact> Contacts)
{
    string str = "";
    foreach(Contact con Contacts)
    {
        str += con.GetName() + ", ";
    }
    return str.Substring(0, str.Length - 2);
}

编辑:我在函数行删除了,但现在出现了另一个错误,这次它标记了函数的名称(ToString),我试图更改名称,但没有任何成功或更改。 现在 GetName() 工作了。

Severity    Code    Description Project File    Line    Suppression State
Error   CS0051  Inconsistent accessibility: parameter type 'List<Contact>' is less accessible than method 'MyExtensions.ToString(List<Contact>)'    Whatsapp    D:\Whatsapp Versions.6\Whatsapp\ExtensionMethods.cs  100 Active

这是打字错误吗?你不小心写了 <Contact>:

public static string ToString <Contact>(this List<Contact> Contacts)
                             ^^^^^^^^^^
                               here

这使得 Contact 成为通用类型参数,使您的扩展方法适用于任何 List<T>。显然您无法访问 Contact 的成员,因为该列表可以是任何内容的列表。要解决此问题,请删除通用参数:

public static string ToString(this List<Contact> Contacts)

请注意,当您直接在 List<Contact> 上调用它时,不会选择此扩展方法,因为 List 已经有一个 ToString 方法(实际上所有 类 ...)。所以调用 your ToString 的唯一方法是 SurroundClass.ToString(someList)。我建议你重命名该方法。

您的代码至少有两个问题:

  1. 如果您调用您的分机 ToString(),您将无法像分机一样使用它,因为如果您有一个

    List<Contact> myContacts = ...
    Console.WriteLine(myContacts.ToString());
    

    编译器将始终选择 List<T> class 的 *实例方法 ToString() 而不是您的扩展。

  2. 您声明了您的方法 generic (ToString<Contact>),当您只想在此处接受 List<Contact> 时,这不是必需的。请注意,您在此处编写的 Contact 现在是通用 类型参数 而不是您的 Contact 类型。这就是编译器不知道 GetName() 方法的原因:con 不是 Contact 类型,而是编译时未知的泛型类型。

  3. 我建议使用 string.Join 而不是连接字符串 "by hand":

所以最后的建议:

public static string AsString(this List<Contact> contacts) =>
     string.Join(", ", contacts.Select(c => c.GetName());