【发布时间】:2017-04-04 11:14:19
【问题描述】:
我不明白为什么这不起作用:
类:
public abstract class BaseObj
{
public bool IsValid => GetValidationErrors().Count == 0;
}
public class BaseObjWithId: BaseObj
{
public int Id { get; set; }
}
public class BaseReference<T> : BaseObj where T : BaseObjWithId
{
public T ObjReference { get; set; }
}
public class Foo: BaseObjWithId
{
public string Name{get;set;}
}
public class FooRef : BaseReference<Foo>
{
}
代码语句:
BaseReference<BaseObjWithId> foo= new FooRef();
错误 CS0029 无法隐式转换类型...
这行得通:
BaseReference<Foo> foo= new FooRef();
但我不明白为什么,因为 Foo 是 BaseObjWithId...
谢谢你的解释
【问题讨论】:
-
肯定是因为 Foo 是 BaseObjectWithID 和 extras,而 fooRef 使用 foo,BaseObjWithId 是一个较小的版本它不一样
-
因为你想做什么是没有意义的。你可以施放它,但它没有任何目的。
-
由于
FooRef与具体类Foo的实例相关联,因此无法将其与其基类绑定,除非您使FooRef 过于通用,这与类型转换无关关于泛型 -
仅仅因为
Foo继承自BaseObjWithId并不意味着BaseReference<Foo>继承自BaseReference<BaseObjWithId>- 它不是 - 它们是两种不同的类型。 -
Cage<Animal>是一个可以容纳任何动物的笼子。Aquarium是Cage<Fish>。那么您可以在需要Aquarium的地方使用Cage<Animal>吗?不;水族馆保证只有鱼出来,但Cage<Animal>可以放出老虎。您可以在需要Cage<Animal>的地方使用Aquarium吗?不可以。您可以将长颈鹿放入Cage<Animal>,但不能放入Aquarium。由于不可能双向转换,所以Aquarium和Cage<Animal>之间一定存在no类型关系。
标签: c#