繁体   English   中英

IEnumerable的Delegate Method参数 <T> 到特定类型

[英]Delegate Method parameter from IEnumerable<T> to specific type

我发现了这个问题: 是否可以为类型参数指定可从其他类型转换的泛型约束? 我正在寻找一种更聪明的方法。

Class A {
     public A(string){}
}

Class foo
{
    private List<A> content = new List<A>();

    public void Add(A a){
        content.Add(a);
    }
    public void Add(string str){
        content.Add(new A(str));
    }
    public void AddRange<T>(IEnumerable<T> iterable) // where T : ???
    {
        foreach(T t in iterable)
            content.Add((A)t); //Error
    }
}

错误是:

无法将类型“ T”转换为“ A”

问题 :存在一个where T : ? 像“可转换”这样的表达?

更新 :我有两个方法重载: Add(A)Add(string)当前,我尝试将T转换为A。但是我的主要问题是,我想使用与T相关的不同Add方法。我需要的是类似:

public void AddRange<T>(IEnumerable<T> iterable) where T : Add(T) 
{
    foreach (T t in iterable)
        this.Add(t);
}

我认为您正在寻找要具有显式运算符T类型约束,但是由于规范说:

  : \n     (   ) 隐式运算符 \n     (   ) 显式运算符  

这通常意味着您不能拥有通用的显式和隐式运算符,我认为这是不可能的。

如果您有一些具体类型,则可以使案子成为可能:

public class A
{
    public static explicit operator B(A a)
    {
        return new B();
    }
}

public class B { }

public class Convert
{
    public static T To<T>(dynamic obj)
    {
        return (T) obj;
    }
}

class Foo
{
    private List<A> content = new List<A>();
    public void AddRange<T>(IEnumerable<T> iterable) where T : B
    {
        foreach (T t in iterable)
            content.Add(Convert.To<A>(t)); // This will invoke the implicit operator defined in A
    }
}

也许您可以将泛型T类型抽象为B类型,并像这样对其进行约束,或者您可以定义所有类型的隐式运算符,希望它们在T类型中转换为A。

如果要让T成为类型A或任何派生类型,请使用where T : A

编辑(发表评论后):

如果要让TAString ,则不能执行以下操作: where T : A, String 您只能约束类,接口,类型,但不能执行OR操作。

因此,如果您只需要StringA ,则应使用其他实现。 如果您要上任何课- where T : class

您可以使用A代替T:

public void Add(IEnumerable<A> iterable)
{
   foreach(A t in iterable)
      content.Add(t);
}

和:

public void Add(IEnumerable<string> iterable)
{
   foreach(string t in iterable)
      content.Add(t);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM