考慮以下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