[英]Can’t assign to delegate an anonymous method with less specific parameter type
[英]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
。
编辑(发表评论后):
如果要让T
为A
或String
,则不能执行以下操作: where T : A, String
。 您只能约束类,接口,类型,但不能执行OR
操作。
因此,如果您只需要String
或A
,则应使用其他实现。 如果您要上任何课- 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.