【问题标题】:Is it possible to do operator overloading with List<T> without inheriting from it? [duplicate]是否可以使用 List<T> 进行运算符重载而不继承它? [复制]
【发布时间】:2019-05-25 10:58:54
【问题描述】:

C# operator overloading with List<T>

Why not inherit from List<T>?

基于第一个问题,我通过从其中一个 List 继承实现了运算符重载。

今天我偶然发现了第二个链接。所以我的问题是“是否可以使用 List 进行运算符重载而不继承它?”

//复制第一个问题的内容

我正在尝试在 C# 中重载一个适用的运算符(不要问为什么!) 到列表。例如,我希望能够写:

List<string> x = // some list of things 
List<string> y = // some list of things 
List<string> z = x + y 

所以'z'包含'x'的所有内容,后跟内容 的'y'。我知道已经有方法可以组合两个列表, 我只是想了解运算符重载是如何工作的 通用结构。

(顺便说一下,这是来自 Systems.Collections.Generic 的 List 类。)

【问题讨论】:

  • 为什么不编写扩展方法而不是尝试执行运算符重载?从好的方面来说,扩展方法可以通过处理实现IList&lt;T&gt;(或ICollection&lt;T&gt;;无论你想要/需要什么......)的任何类型来实现通用目的。
  • @elgonzo:你能为第一个问题写这个吗?我不希望在其他列表中使用该功能。
  • 解释为什么不继承的例子推荐组合而不是继承。操作重载不是组合。它只是您想要添加到现有类的额外功能。因此,如果您将继承用于运算符重载,那么您并没有错。你可以有一些更好的方法,比如扩展方法或在基础上有一个接口等。
  • @ChetanRanpariya 扩展方法会将该功能添加到所有列表中,我只想要一些列表。
  • @DeepakMishra,不正确。扩展方法不需要适用于所有(列表)类型。扩展方法适用于可分配给扩展方法的this 参数类型的类型。 (如果扩展方法是泛型的,甚至可以通过使用泛型类型约束来进一步限制)

标签: c# .net


【解决方案1】:

你不能在类外做运算符重载。您可以使用容器进行运算符重载

您可以在此处运行此代码url


using System;
 using System.Collections;
 using System.Collections.Generic;

  public class Program
  {
    public static void Main()
    {
        Run();
    }

    public static void Run()
         {
             var ls = new List<int>(){
                 1,3,5,7,9,11
             };
             var ls2 = new List<int>(){
                 2,4,6,8,10
             };

             var lsContainer = new AdditionContainer<List<int>,int>(ls);
             var ls2Container = new AdditionContainer<List<int>,int>(ls2); 
             var finalAnsower =   lsContainer +ls2Container;
             finalAnsower.List.ForEach(f=>Console.WriteLine(f) );


    }


}


public class AdditionContainer<TList,T>

     where TList:List<T>
{
         public TList List;
         public AdditionContainer(TList list )
         {
               List=list;   
         }

         public static AdditionContainer<TList,T> operator +(AdditionContainer<TList,T> a, AdditionContainer<TList,T> b)
         {
               b.List.ForEach(l =>{
                  if(!a.List.Contains(l))
                  {
                     a.List.Add(l);  
                  }
               });
               return a;
         }       
     }

【讨论】:

  • 哇!很好的实施!看起来像装饰器模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2011-08-04
  • 2010-09-25
相关资源
最近更新 更多