C# 泛型继承,base class casting
C# generic inheritance, base class casting
我想用包含的泛型进行以下继承,但最后的转换
a as A<XBase>
总是导致 null,因为转换无效。谁能详细说明为什么这个转换无效,以及这个问题的解决方案。
public class XBase {}
public interface A<T> where T : XBase
{
//Edited
void Method(T param);
}
public class Implementor : A<Implementor.ImplementorX >
{
public class ImplementorX : XBase {public int a;}
//Edited
void Method(ImplementorX param) {}
}
public class HelloWorld
{
public static void Main(string[] args)
{
var a = new Implementor();
var castRes = a as A<XBase>;
Console.WriteLine(castRes != null);
}
}
查看实例 https://rextester.com/BTNVT61833
已编辑:向 interface A<T>
添加了一个方法,否则它可以通过@DavidG 的响应
来解决
如果进行显式转换:
var castRes = A<XBase>(a);
然后您将看到以下错误:
Unable to cast object of type '' to type '`
为什么?在我看来,最好使用真实世界的例子来理解。我已重命名 类 based on this explanation。有评论将解释映射到您的 类 问题。
抽象:
// XBase
public class Animal { }
// class ImplementorX : XBase {public int a;}
public class Bird : Animal
{
public string WingColor { get; set; }
}
// interface A<T> where T : XBase
public interface IHat<T> where T : Animal
{
void Hide(T param);
T Pull();
}
具体实现:
// class Implementor : A<Implementor.ImplementorX >
public class Peacock : IHat<Bird>
{
// void Method(ImplementorX param) {}
void IHat<Bird>.Hide(Bird param)
{ }
public Bird Pull()
{ }
}
以及如何称呼它:
public static void Main(string[] args)
{
Peacock peacockHat = new Peacock();
IHat<Animal> animalHat = (IHat<Animal>) peacockHat; // runtime error 'Unable to cast
// object of type 'HelloWorld.Peacock' to type 'HelloWorld.IHat`1
// because
animalHat.Hide(new Dolphin()); // Hide a dolphin in a peacock hat?
}
所以我们不能 hide
来自 Dolphin
的 Peacock
的帽子。这不好。 CLR 防止我们做出不当行为。
简而言之:
简而言之,假设您有两只动物,例如 Wolf
和 Sheep
。这些 类 实现了 IAnimal 接口:
public interface IAnimal
{ }
public class Wolf: IAnimal
{ }
public class Sheep : IAnimal
{ }
所以Sheep
,Wolf
类实现继承接口IAnimal
:
IAnimal
/ \
/ \
Sheep Wolf
然后可以把这些动物关在笼子里:
public class Cage<T> where T : IAnimal
{
public void Put(T animal)
{ }
}
然后你为 Sheep
创建一个笼子。之后有人想将 Sheep
cage 投射到 IAnimal
:
Cage<Sheep> sheepCage = new Cage<Sheep>();
sheepCage.Put(new Sheep());
Cage<IAnimal> animalCage = (Cage<Wolf>)sheepCage; // compile error
// if there were no error, then you will be able to do:
animalCage.Put(new Wolf()); // it is not good idea
我想用包含的泛型进行以下继承,但最后的转换
a as A<XBase>
总是导致 null,因为转换无效。谁能详细说明为什么这个转换无效,以及这个问题的解决方案。
public class XBase {}
public interface A<T> where T : XBase
{
//Edited
void Method(T param);
}
public class Implementor : A<Implementor.ImplementorX >
{
public class ImplementorX : XBase {public int a;}
//Edited
void Method(ImplementorX param) {}
}
public class HelloWorld
{
public static void Main(string[] args)
{
var a = new Implementor();
var castRes = a as A<XBase>;
Console.WriteLine(castRes != null);
}
}
查看实例 https://rextester.com/BTNVT61833
已编辑:向 interface A<T>
添加了一个方法,否则它可以通过@DavidG 的响应
如果进行显式转换:
var castRes = A<XBase>(a);
然后您将看到以下错误:
Unable to cast object of type '' to type '`
为什么?在我看来,最好使用真实世界的例子来理解。我已重命名 类 based on this explanation。有评论将解释映射到您的 类 问题。
抽象:
// XBase
public class Animal { }
// class ImplementorX : XBase {public int a;}
public class Bird : Animal
{
public string WingColor { get; set; }
}
// interface A<T> where T : XBase
public interface IHat<T> where T : Animal
{
void Hide(T param);
T Pull();
}
具体实现:
// class Implementor : A<Implementor.ImplementorX >
public class Peacock : IHat<Bird>
{
// void Method(ImplementorX param) {}
void IHat<Bird>.Hide(Bird param)
{ }
public Bird Pull()
{ }
}
以及如何称呼它:
public static void Main(string[] args)
{
Peacock peacockHat = new Peacock();
IHat<Animal> animalHat = (IHat<Animal>) peacockHat; // runtime error 'Unable to cast
// object of type 'HelloWorld.Peacock' to type 'HelloWorld.IHat`1
// because
animalHat.Hide(new Dolphin()); // Hide a dolphin in a peacock hat?
}
所以我们不能 hide
来自 Dolphin
的 Peacock
的帽子。这不好。 CLR 防止我们做出不当行为。
简而言之:
简而言之,假设您有两只动物,例如 Wolf
和 Sheep
。这些 类 实现了 IAnimal 接口:
public interface IAnimal
{ }
public class Wolf: IAnimal
{ }
public class Sheep : IAnimal
{ }
所以Sheep
,Wolf
类实现继承接口IAnimal
:
IAnimal
/ \
/ \
Sheep Wolf
然后可以把这些动物关在笼子里:
public class Cage<T> where T : IAnimal
{
public void Put(T animal)
{ }
}
然后你为 Sheep
创建一个笼子。之后有人想将 Sheep
cage 投射到 IAnimal
:
Cage<Sheep> sheepCage = new Cage<Sheep>();
sheepCage.Put(new Sheep());
Cage<IAnimal> animalCage = (Cage<Wolf>)sheepCage; // compile error
// if there were no error, then you will be able to do:
animalCage.Put(new Wolf()); // it is not good idea