将方法类型参数约束为类泛型类型的基础

我想确保方法类型参数是类泛型类型的基类型,所以我首先自然地写了这个:

public class FivePM<T> {
    public void drink<M>(M x) where T : M {}
}

有没有什么特定的原因,为什么这不能工作?

背景

我编写了容器类Bag<B> ,它存储在不同实例之间共享的项目,因此如果项目添加到另一个项目中,则会自动从一个项目中移除项目。 这是通过BagSet<BT>内部完成的,其中包含常用物品的袋子。 我希望bag generic类型是集合中最低的普通类型的项目,但不希望constrian B完全是BT而是任何派生类型。 我设法为袋子设计了类型安全的公共接口,满足了我的要求,但由于通用的约束限制,袋子的结构看起来很尴尬,我不能使用列表初始化程序:

BagSet<object> bset = new BagSet<object>();
Bag<int> suitcase = bset.newBag<int>();

public class BagSet<T> : BagSetBase {
    public Bag<B> newBag<B>(string name = null, params B[] items) where B : T {
        var b = new Bag<B>(this, name);
        for (int i = 0; i < items.Length; i++) b.Add(items[i]);
        return b;
    }
}

通用约束有一天会得到改善吗? 也许我应该等到广泛地做这样的事情之前。


有没有什么特定的原因,为什么这不能工作?

如果你的意思是为什么这种约束没有意义,那么逻辑上的原因是,否。 这是一个非常明智的约束,并且有支持这种约束的语言。 Java,例如。 和斯卡拉。

如果你的意思是为什么这在C#中不起作用,那很简单。 没有人在C#中实现过该功能。 为了让功能在C#中工作,有人必须考虑它,设计它,编写规范,实现规范,编写测试,然后将其发送给客户。 在那些必要的步骤中,只有第一个发生了。

通用约束有一天会得到改善吗?

要求对未来进行预测的问题与Stack Overflow无关。 我们无法可靠地预测未来。

如果你希望这个特性在未来的C#版本中,可以考虑在github论坛上提倡它。


使用真实的代码,如果你让class Bag有两种类型并处理继承要求BagSet - 毕竟,你并不在乎BagSet

public class BagSet<T> {
    public Bag<B, T> newBag<B>(string name = null, params B[] items) where B : T {
        var b = new Bag<B, T>(this, name);
        for (int i = 0; i < items.Length; i++) b.Add(items[i]);
        return b;
    }
}

public class Bag<B, T> where B : T {
    BagSet<T> common;
    string bsname;

    public Bag(BagSet<T> bs, string name) {
        common = bs;
        bsname = name;
    }
    public void Add(B item) {
    }
}

然后你可以像这样声明它们:

var bset = new BagSet<object>();
var suitcase = bset.newBag<int>();

我想你可能能够得到这个工作:

public class FivePM<T, M> where T : M 
{
    public void drink(M x) 
}

但是,然后你的问题再次让我困惑,现在已经过了午夜,所以我可能会错,我可能会误解这个问题....或者可能不是?

链接地址: http://www.djcxy.com/p/49131.html

上一篇: Constrain method type argument to be base of class generic type

下一篇: How to register and use different implementation of same interface?