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

时间:2018-06-18 16:26:12

标签: c# visual-studio extension-methods

我有一个联系人类,我想为该类的列表创建一个Extension方法,但它不会识别我的con.GetName()函数。 我使用了正确的reffernce,它确实识别了类名,尽管它不会识别类的实例方法

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\17.6\Whatsapp\ExtensionMethods.cs  100 Active

2 个答案:

答案 0 :(得分:3)

这是一个错字吗?你不小心写了<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方法(实际上所有类都有...)。因此,致电 ToString的唯一方法是SurroundClass.ToString(someList)。我建议你重命名这个方法。

答案 1 :(得分:3)

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

  1. 如果您拨打分机号ToString(),您将无法像分机一样使用它,因为如果您有

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

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

  2. 您宣布自己的方法通用ToString<Contact>),当您只想在此处接受List<Contact>时,这是不必要的。请注意,您在此处撰写的Contact现在是通用的类型参数,而不是您的Contact类型。但是编译器不知道GetName()方法:con不是类型Contact,而是编译时未知的泛型类型。

  3. 我建议使用string.Join而不是“手动”连接字符串:

  4. 所以最后的建议是:

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