【问题标题】:Extension Method of List<t> not recognize Instance method of the class C#List<t> 的扩展方法无法识别 C# 类的实例方法
【发布时间】:2018-06-18 16:26:12
【问题描述】:

我有一个联系人类,我想为该类的列表创建一个扩展方法,但它无法识别我的 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

【问题讨论】:

  • 向我们展示GetName 方法,并确保您有正确的导入。
  • 为什么这个方法是通用的?注意这里的Contact通用类型参数,而不是你的类Contact。由于您只关心Contacts,因此不要将方法设为通用。更糟糕的是:你永远不能像扩展一样调用这个方法,因为 List&lt;T&gt; 像所有类型一样已经定义了一个名为 ToSTring() 的实例方法,它将始终被选择而不是你的扩展。
  • @RenéVogt 好吧,因为它是通用的,您可以通过指定类型参数来调用它,但正如 Sweeper 在他们的回答中所说,它根本不需要。
  • 您可以缩短您的代码:return string.Join(", ", Contacts.Select(c =&gt; c.GetName()));

标签: c# visual-studio extension-methods


【解决方案1】:

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

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

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

    编译器将始终选择 List&lt;T&gt; 类的 *instance 方法 ToString() 而不是您的扩展。

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

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

所以最后的建议:

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

【讨论】:

  • 我删除了 ,并且实例方法工作正常,尽管删除后函数行名称出错,正如我在问题编辑中提到的那样。而且我确实也更改了函数的名称
【解决方案2】:

这是一个错字吗?你不小心写了&lt;Contact&gt;

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

这使Contact 成为泛型类型参数,使您的扩展方法可以在任何List&lt;T&gt; 上工作。显然,您无法访问Contact 的成员,因为该列表可以是任何内容的列表。要解决此问题,请删除通用参数:

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

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

【讨论】:

  • 我删除了 ,并且实例方法工作正常,尽管删除后函数行名称出错,正如我在问题编辑中提到的那样。而且我确实也更改了函数的名称
  • @delex 根据你的需要,把Contact改成public或者你的方法改成internal
猜你喜欢
  • 2018-01-15
  • 2011-02-05
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多