ICollection <t>其中T实现接口</t>

时间:2010-02-15 22:21:12

标签: c# .net

有没有办法做这样的事情?

public interface ISomething
{
}

public class SomethingThatImplementsISomething: ISomething
{
}

public class SomethingElse
{
 public ICollection<ISomething> PropertyName{ get; set; }
}

我已经尝试过了,它一直都在失败。有什么想法吗?

4 个答案:

答案 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());