在C#中强制约束泛型类

All*_*pel 7 c# generics casting

很简单,为什么这段代码无法编译?

public interface IWorld { }
public class Foo<T> where T : IWorld { }
public void Hello<T>(T t) where T : IWorld
{
    Foo<IWorld> bar1 = new Foo<T>(); //fails implicit cast
    Foo<IWorld> bar2 = (Foo<IWorld>)new Foo<T>(); //fails explicit cast
}
Run Code Online (Sandbox Code Playgroud)

由于每个T实现IWorld,每个实例都Foo<T>应该匹配Foo<IWorld>.为什么不?有没有办法解决?我真的不想借助于泛型来实现这一目标.

Yas*_*ani 1

T : IWorld
Run Code Online (Sandbox Code Playgroud)

意味着 T 已经实现了 IWorld,并不意味着它只实现了 IWorld 并且确切地说是 IWorld。它也可能已经实现了其他接口。

但是,C# 在其后续版本中支持这种转换。请参阅http://msdn.microsoft.com/en-us/library/dd799517.aspx(泛型中的协方差和逆变)