Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在泛型类的一个成员函数c中进一步约束泛型类#_C#_Oop_Generics - Fatal编程技术网

C# 在泛型类的一个成员函数c中进一步约束泛型类#

C# 在泛型类的一个成员函数c中进一步约束泛型类#,c#,oop,generics,C#,Oop,Generics,在这里没有泛型的经验。如果一个方法的类型继承权较低,我是否能够比它的类约束更严格地约束它的类型 以下是我尝试的内容(BotAccountDetailsBase源自AccountDetailsBase): 公共类安全优惠,其中TAcc:AccountDetailsBase { 公共只读TAcc账户; 公共只读列表项; 私人保险箱优惠(TAcc账户、清单项目) { 账户=账户; 项目=项目; } public static List DivideOffer(IEnumerable accounts,

在这里没有泛型的经验。如果一个方法的类型继承权较低,我是否能够比它的类约束更严格地约束它的类型

以下是我尝试的内容(BotAccountDetailsBase源自AccountDetailsBase):

公共类安全优惠,其中TAcc:AccountDetailsBase
{
公共只读TAcc账户;
公共只读列表项;
私人保险箱优惠(TAcc账户、清单项目)
{
账户=账户;
项目=项目;
}
public static List DivideOffer(IEnumerable accounts,List items),其中TBot:BotAccountDetailsBase
{
var账户到交易=新列表();
//获取正确类型的机器人,按插槽排序
var typed\u account=accounts.OfType().OrderByDescending(x=>x.slotsleet\ux);
foreach(类型化账户中的var acc)
{
如果(items.Count>0)
{
var bundle=项目数量(根据slotsleet_uu2;);
RemoveAll(x=>bundle.Contains(x));
var offer=新的SafeOffer(acc,bundle.ToList());
账户到交易。添加(报价);
}
}
将账户返回至交易;
}
}

因为TAcc和TBot不一样,所以它不编译。我可以使用魔法施法吗?

只需将返回类型更改为
列表即可:

公共静态列表
DivideOffer(IEnumerable帐户、列表项)
其中TBot:BotAccountDetailsBase

您能否创建一个自己编译(或不编译)的示例,而不依赖于大量未发布在此处的类?我对修补代码很感兴趣,但我不会创建所有缺少的类。A会有帮助的。在这种情况下你真的需要泛型吗?基础还不够吗?我发誓我试过:)
  public class SafeOffer<TAcc> where TAcc : AccountDetailsBase
  {
    public readonly TAcc account_;
    public readonly List<ItemData> items_;

    private SafeOffer(TAcc account, List<ItemData> items)
    {
      account_ = account;
      items_ = items;
    }

    public static List<SafeOffer<TAcc>> DivideOffer<TBot>(IEnumerable<BotAccountDetailsBase> accounts, List<ItemData> items) where TBot : BotAccountDetailsBase
    {
      var accounts_to_trade = new List<SafeOffer<TBot>>();

      // get the bots of the right type, order by slots
      var typed_account = accounts.OfType<TBot>().OrderByDescending(x => x.slotsleft_);

      foreach (var acc in typed_account)
      {
        if (items.Count > 0)
        {
          var bundle = items.Take(acc.slotsleft_);
          items.RemoveAll(x => bundle.Contains(x));
          var offer = new SafeOffer<TBot>(acc, bundle.ToList());
          accounts_to_trade.Add(offer);
        }
      }
      return accounts_to_trade;
    }
  }
public static List<SafeOffer<TBot>> 
    DivideOffer<TBot>(IEnumerable<BotAccountDetailsBase> accounts, List<ItemData> items) 
        where TBot : BotAccountDetailsBase