有人可以向我解释为什么以下演员表不起作用以及解决问题的方法。
我有AbstractKafkaAvroDeserializer
:
GroupedResult
我想将public class GroupedResult<TKey, TElement>
{
public TKey Key { get; set; }
private readonly IEnumerable<TElement> source;
public GroupedResult(TKey key, IEnumerable<TElement> source)
{
this.source = source;
this.Key = key;
}
}
public class Bacon
{
}
投射到List<string, Bacon>
。我尝试了以下和其他方式。
List<string, object>
但我总是收到以下错误:
InvalidCastException:无法转换类型&#39; GroupedResult
var list = new List<GroupedResult<string, Bacon>> { new GroupedResult<string, Bacon>("1", new List<Bacon>()), new GroupedResult<string, Bacon>("2", new List<Bacon>()) }; var result = list.Cast<GroupedResult<string, object>>().ToList();
2 [System.String,System.Object]&#39;的对象。
答案 0 :(得分:1)
为此,你必须使用界面而不是类型。
public interface IGroupResult<TKey, out TElement>
{
TKey Key { get; set; }
}
public class GroupedResult<TKey, TElement> : IGroupResult<TKey, TElement>
{
public TKey Key { get; set; }
private readonly IEnumerable<TElement> source;
public GroupedResult(TKey key, IEnumerable<TElement> source)
{
this.source = source;
this.Key = key;
}
}
public class Bacon
{
}
然后你可以做类似
的事情IGroupResult<string, Bacon> g = new GroupedResult<string, Bacon>("1", new List<Bacon>());
var result = (IGroupResult<string, object>)g;
这是因为只有接口和委托才允许协方差,而不允许类。请注意,如果类型仅来自接口(方法返回类型和只读属性),则应仅将类型标记为共变量。
虽然您应该问自己为什么要在使用泛型时向object
投射内容。泛型的要点是避免使用object
类型作为全部捕获,这可能表明您的设计中存在一个您可能想要重新考虑的缺陷。
答案 1 :(得分:0)
最好从GroupedResult开始&lt; string,object&gt;然后你可以这样做
new GroupedResult<string, object>("2", new List<Bacon>())
答案 2 :(得分:0)
为什么您使用GroupedResult<string, object>
代替GroupedResult<string, Bacon>
?像这样:
var list = new List<GroupedResult<string, object>>
{
new GroupedResult<string, object>("1", new List<Bacon>()),
new GroupedResult<string, object>("2", new List<Bacon>())
};
答案 3 :(得分:0)
您可以在Cast
课程中使用GroupedResult
方法并使用它进行投射!
public class GroupedResult<TKey, TElement>
{
public TKey Key { get; set; }
private readonly IEnumerable<TElement> source;
public GroupedResult(TKey key, IEnumerable<TElement> source)
{
this.source = source;
this.Key = key;
}
public GroupedResult<TKey, object> Cast()
{
return new GroupedResult<TKey, object>(Key, source.Cast<object>());
}
}
public class Bacon
{
}
static void Main(string[] args)
{
var list = new List<GroupedResult<string, Bacon>>
{
new GroupedResult<string, Bacon>("1", new List<Bacon>()),
new GroupedResult<string, Bacon>("2", new List<Bacon>())
};
// var result = list.Cast<GroupedResult<string, object>>().ToList();
List<GroupedResult<string,object>> result = list.Select(B => B.Cast()).ToList();
}