c# - 限制通用扩展方法扩展字符串

标签 c# methods extension-methods

我有一个非常通用的扩展方法来在控制台中显示任何类型的列表:

public static void ShowList<T>(this IEnumerable<T> Values)
{
    foreach (T item in Values)
    {
        Console.WriteLine(item);
    }
}

不是当我有一个字符串时我可以使用这个方法

string text = "test";
text.ShowList();

但是对于 string 它在我的应用程序中没有意义。

如何从该方法中排除 string?我读过一些关于

ShowList<T>(this IEnumerable<T> Values): Where != string //doesn't work

最佳答案

老实说,开始时这感觉有点奇怪 - 如果某些东西应该适用于任何字符序列,那么它应该适用于字符串,一系列字符。

如果你真的想让它编译失败,你可以添加一个重载接受string标记为已过时:

[EditorBrowsable(EditorBrowsableState.Never)]
[Obsolete(IsError = true, Message = "A string is a sequence of characters, but is not intended to be shown as a list")]
public static void ShowList(this string text)
{
    throw new NotSupportedException();
}

重载解析会选择那个方法,然后编译失败。 EditorBrowsable属性将希望从 Intellisense 中删除它 - 但你必须看看它是否真的有效。 (它可能仍然显示另一个过载,即使不会被选中。)

另一种选择是实现 ShowList<T>就好像该字符串是一个单项列表:

// Specialization to avoid listing each character separately.
public static void ShowList(this string text) => new[] { text }.ShowList();

换句话说,使调用有效,但更适本地处理它。

关于c# - 限制通用扩展方法扩展字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929109/

相关文章:

java - 涉及数组的面向对象编程

javascript - 使用 "new"表示法将函数设置为对象成员

c# - 一次性在多个表中添加数据,并在它们之间设置外键约束

c# - 启动线程时的不同行为 : ParameterizedThreadStart vs. 匿名委托(delegate)。为什么这有关系?

java - 我在生成贷款配置时缺少哪些循环?

c# - 如何使用 C# LINQ Union 获取自定义 list1 与 list2 的联合

c# - 为什么不能为静态类创建扩展方法?

c# - 为什么不能在泛型静态类中声明扩展方法?

c# - Visual Studio - 默认转到接口(interface)的实现

c# - 多个派生抽象类?