- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有
public interface IFoo
{
IEnumerable<IThingy> Thingies{get;}
}
我想然后能够做
class Thing1 : IThingy
{
...
}
class ImplementFoo : IFoo
{
List<Thing1> m_things;
IEnumerable<IThingy> Thingies {get {return m_things;}}
}
ImplementFoo.Thingies 返回 Thing1s(即 IThings)的 IList(这是一个 IEnumerable)。所以理论上这段代码应该可以工作,但事实并非如此。 VS 建议在 getter 中进行转换;编译但在运行时失败。我是否期望 C# 4 中的协方差过多?
VS 2010 -> Silverlight 4. 这是编译错误
Cannot implicitly convert type '
System.Collections.Generic.List<MyProj.Column>
' to 'System.Collections.Generic.IEnumerable<MyProj.IColumn>
'. An explicit conversion exists (are you missing a cast?)
编辑:人们告诉我这应该有效,但它在 SL4 中不起作用
最佳答案
这在 C#/.NET 4 中运行良好。这是一个完整的、编译的和工作的示例:
namespace Test
{
using System;
using System.Collections.Generic;
using System.Linq;
public interface IThingy { }
public interface IFoo
{
IEnumerable<IThingy> Thingies { get; }
}
internal class Thing1 : IThingy { }
internal class ImplementFoo : IFoo
{
private List<Thing1> m_things = new List<Thing1>() { new Thing1() };
public IEnumerable<IThingy> Thingies
{
get { return m_things; }
}
}
internal class Program
{
private static void Main(string[] args)
{
var impl = new ImplementFoo();
Console.WriteLine(impl.Thingies.Count());
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
我怀疑问题是您针对的是 .NET 3.5sp1 或更早版本,而不是 .NET 4.0。协方差仅在面向 .NET 4 时才能正常工作,因为它需要新的框架更改。在这种情况下,IEnumerable<T>
, 在 .NET 4 中,实际上是 IEnumerable<out T>
,这是工作所必需的。
关于c# - 双协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797098/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!