繁体   English   中英

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

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

我有一个联系人类,我想为该类的列表创建一个扩展方法,但它无法识别我的con.GetName()函数。 我使用正确的引用,它可以识别类名,尽管它不能识别该类的实例方法

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

这是错字吗? 您不小心写了<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方法(实际上所有类都可以...)。 于是打电话给的唯一途径ToStringSurroundClass.ToString(someList) 我建议您重命名该方法。

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

  1. 如果您调用扩展名ToString() ,将无法像扩展名一样使用它,因为如果您有一个

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

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

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

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

所以最后的建议是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM