我有一个联系人类,我想为该类的列表创建一个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
答案 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)
您的代码至少有两个问题:
如果您拨打分机号ToString()
,您将无法像分机一样使用它,因为如果您有
List<Contact> myContacts = ...
Console.WriteLine(myContacts.ToString());
编译器将始终选择ToString()
类的*实例方法List<T>
而不是您的扩展名。
您宣布自己的方法通用(ToString<Contact>
),当您只想在此处接受List<Contact>
时,这是不必要的。请注意,您在此处撰写的Contact
现在是通用的类型参数,而不是您的Contact
类型。但是编译器不知道GetName()
方法:con
不是类型Contact
,而是编译时未知的泛型类型。
我建议使用string.Join
而不是“手动”连接字符串:
所以最后的建议是:
public static string AsString(this List<Contact> contacts) =>
string.Join(", ", contacts.Select(c => c.GetName());