有没有办法做这样的事情?
public interface ISomething
{
}
public class SomethingThatImplementsISomething: ISomething
{
}
public class SomethingElse
{
public ICollection<ISomething> PropertyName{ get; set; }
}
我已经尝试过了,它一直都在失败。有什么想法吗?
答案 0 :(得分:6)
ICollection<Models.Awardable>
不可以转换为ICollection<IAwardable>
。
如果有人试图将IAwardable
添加到不是 Models.Awardable
的集合中,会发生什么?
只需实例化IAwardable
的集合,并向其添加Models.Awardable
的实例。
答案 1 :(得分:2)
确保编辑单元顶部有using System.Collections.Generic
而不仅仅using System.Collections
。
编辑添加:
实际上,这可能与4.0之前的C#版本不允许泛型的协方差或逆变这一事实有关。在旧版本中,必须定义通用字段以使用精确数据类型,以避免无效的引用类型分配。
再次编辑:
现在我看到了您收到的实际错误消息,问题不在于字段的定义,而是在其使用中。你需要在作业中加上一个明确的演员。
答案 2 :(得分:1)
自动属性
public ICollection<ISomething> PropertyName{ get; set; }
尝试创建类型为ICollection<>
的后备字段,该字段将失败。尝试类似:
public List<ISomething> PropertyName{ get; set; }
答案 3 :(得分:1)
听起来你要做的就是:
ICollection<SomethingThatImplementsISomething> collection = new List<SomethingThatImplementsISomething>();
somethingElse.PropertyName = collection;
如果是这种情况,那么这是一个generic variance问题。 ICollection的元素类型不协变。 (因为它,你现在可以去somethingElse.PropertyName.Add(somethingDifferentThatsAlsoAnISomething);
- 并且你已经将SomethingDifferentThatsAlsoAnISomething添加到SomethingThatImplementsISomething的列表中,这会打破类型安全。)
您需要实例化ISomethings的集合:
ICollection<ISomething> collection = new List<ISomething>();
somethingElse.PropertyName = collection;
然后,您可以将SomethingThatImplementsISomething对象添加到您心中的内容:
somethingElse.PropertyName.Add(new SomethingThatImplementsISomething());