考虑以下C#泛型古怪
public class MyBuilder {}
public interface IBuilder
{
MyBuilder Builder { get; }
}
public class TestGeneric<B, S> where B : IBuilder, new()where S : MyBuilder
{
public TestGeneric()
{
B b = new B();
S s = b.Builder ;// as S;
}
}
编译器会抱怨:
无法隐式转换类型 'MyBuilder' 到 'S'。存在明确的 转换...
为什么不呢? 毕竟我明确指出S:MyBuilder,这是一个base类。
我也不认为Parameter Invariance适用于此。 和this SO问题是相似的,但我没有看到为什么答案。 我使用VS 2013和.Net 4.5。当然还有铸造作品。
编辑:我有一个密封的类以前。
但是不是S:MyBuilder和'is-a'的关系?编译器不应该尝试在这里上传。如果MyNewBuilder:MyBuilder你的例子应该工作得很好。 – narendra
@narendra但是'IBuilder.Builder'是'MyBuilder'(不一定是'S'),所以's s = b.Builder'会将'MyBuilder'上传到'S'。 –
啊! IBuilder.MyBuilder不是MyBuilder,因此会产生upcast。谢谢! – narendra