1 回答
TA贡献1859条经验 获得超6个赞
即使你的Template类继承自Template<double>,它也不一样。考虑您将更改的定义Template如下:
public class Template : Template<double>
{
public int AddedMember { get; set; }
}
现在,您尝试执行前面的代码。您正在尝试将具有某些属性的类转换为具有更多属性的类 - 您将访问内存中不正确的位置!
您始终可以将类转换为其基类,因为驱动类包含所有基类的成员。因此,不需要显式转换。但是,当您尝试将基类转换为驱动类时,只有当基类变量指向驱动类的实例时,转换才会成功,因此,驱动类的所有成员都存在。如果否,InvalidCastException则在运行时抛出遗嘱。因此,需要显式转换(因为使用显式转换的准则之一是在转换可能失败时使用显式转换)。
因此,如果您将代码更改为变量 a(类型Template<double>),则转换将成功:
Template<double> a = new Template();
Template b = (Template)a; // No exception will thrown
最后的代码会成功,因为变量a指向的Template(而不是Template<double>)的实例,所以我们确定(在运行时)所有的成员Template都存在并且不会发生错误。
编辑:
你说出你的要求后,我可以帮你。你想要什么?您想启用“模板”到“模板”的转换 - 这可以通过 [用户定义的转换](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions -运营商/转换运营商)。
但是,不允许在驱动类和基类之间进行自定义转换。所以,有两种解决方案:
Template不会继承自Template<double>,如下所示:
public class Template<T>
{
public T Value { get; set; }
}
public class Template
{
public double Value { get; set; }
public static explicit operator Template(Template<double> generic) // Or implicit instead of explicit
{
return new Template { Value = generic.Value };
}
}
var generic = new Template<double> { Value = 1234.56 };
var nongeneric = (Template)generic; // Or Template nongeneric = generic; if the conversion defined as implicit
您不会定义自定义转换,而是定义一个常规方法(我定义了一个构造函数):
public class Template<T>
{
public T Value { get; set; }
}
public class Template : Template<double>
{
public Template(Template<double> generic)
{
this.Value = generic.Value;
}
}
var generic = new Template<double> { Value = 1234.56 };
var nongeneric = new Template(generic);
- 1 回答
- 0 关注
- 205 浏览
添加回答
举报