在 C# 扩展函数中使用泛型

发布于 2024-08-07 10:40:12 字数 622 浏览 6 评论 0原文

我正在使用泛型将 Java 代码转换为 C#,但在使用此类容器时遇到了麻烦:

public static class MyExtensions
{
    public static void add(this List<object> list, object obj)
    {
        list.Add(obj);
    }
    public static void add(this List<string> list, string s)
    {
        list.Add(s);
    }
}

似乎泛型在比较参数时丢失了,并且两种方法发生了冲突。我想要关于是否可以以这种方式使用泛型的任何建议。 ,是否可以使用单个:支持所有列表操作

    public static void add(this List<object> list, object obj)
    {
        list.Add(obj);
    }

例如

摘要 所有回复都有相同的解决方案。 List可以抽象为ICollection。总的来说,这对于生产代码来说可能不是一个好主意。

I am using generics to translate Java code to C# and having trouble with containers of the sort:

public static class MyExtensions
{
    public static void add(this List<object> list, object obj)
    {
        list.Add(obj);
    }
    public static void add(this List<string> list, string s)
    {
        list.Add(s);
    }
}

It seems that the generics are lost in comparing arguments and the two methods collide. I'd like any advice on whether generics can be used in this way. Is it possible to support all list operations with a single:

    public static void add(this List<object> list, object obj)
    {
        list.Add(obj);
    }

for example?

SUMMARY All responses have the same solution.
List can be abstracted to ICollection. Overall it's probably not a good idea for production code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

最单纯的乌龟 2024-08-14 10:40:12

怎么样:(

public static void add<T>(this IList<T> list, T value)
{
    list.Add(value);
}

实际上,它可能是 ICollection,因为它(不是 IList)定义了 Add(T)

How about:

public static void add<T>(this IList<T> list, T value)
{
    list.Add(value);
}

(actually, it could be ICollection<T>, since this (not IList<T>) defines Add(T))

少女净妖师 2024-08-14 10:40:12

您是否尝试过:

public static void add<T>(this List<T> list, T obj)
{
    list.Add(obj);
}

我不确定您是否想将其限制在一个类中,但这应该可以达到您所描述的效果。

Have you tried:

public static void add<T>(this List<T> list, T obj)
{
    list.Add(obj);
}

I'm not sure if you'd want to constrain it to a class or not, but that should do what you're describing.

心头的小情儿 2024-08-14 10:40:12

你的意思是这样吗:

public static void add<T>(this List<T> list, T obj)
{
    list.Add(obj);
}

Do you mean this:

public static void add<T>(this List<T> list, T obj)
{
    list.Add(obj);
}
聊慰 2024-08-14 10:40:12

我认为 Marc Gravell 回答得最好,但我会添加:

根本不要这样做。没有任何优点:

myList.add(obj);

vs

myList.Add(obj);

这里唯一的“优点”是你生成的 C# 对于大多数开发人员来说看起来是错误的。如果您打算从 Java 移植到 C#,那么值得花额外的时间来使您的方法看起来和工作起来像本机 .NET 方法。

I think Marc Gravell answered this best, but I will add:

Don't do this at all. There is no advantage to:

myList.add(obj);

vs

myList.Add(obj);

The only "advantage" here is that your resulting C# will look wrong to most developers. If you're going to port from Java to C#, it's worth taking the extra time to make your methods look and work like native .NET methods.

药祭#氼 2024-08-14 10:40:12

最通用的方式:

public static void add<T>(this ICollection<T> list, T obj) // use ICollection<T>
{
    list.Add(value);
}

The most versatile way:

public static void add<T>(this ICollection<T> list, T obj) // use ICollection<T>
{
    list.Add(value);
}
儭儭莪哋寶赑 2024-08-14 10:40:12

@Dreamwalker,你是说吗? list.Add(obj);

@Dreamwalker, did you mean? list.Add(obj);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文