Adr*_*tti 3 .net c# generics casting
鉴于这个虚构的例子:
class NonGeneric
{
}
class Generic<T> : NonGeneric
where T : NonGeneric
{
T DoSomething()
{
return this; // **
}
}
Run Code Online (Sandbox Code Playgroud)
我期望它编译:Generic<T>派生自NonGeneric并且T必须是派生类,因此它满足其约束.
我应该能够做到这一点:
NonGeneric obj = new Generic<NonGeneric>();
Run Code Online (Sandbox Code Playgroud)
那么这个指令应该没有问题:
return this;
Run Code Online (Sandbox Code Playgroud)
或者至少这个:
return (T)this;
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用,上面的例子没有编译错误:
无法将类型转换
NonGeneric<T>为'T'
我做错了什么,我看不到它,或者只是不被允许?为什么这个?
如果可能的话,我会避免使用我在本文中描述的任何解决方法(反射,动态编译方法等).我也会避免使用dynamic对象(设计决定,我不能改变它).
this是NonGeneric,T是NonGeneric,但this不一定T.从编译器的角度来看,它们可以是不同的子类.
考虑班级:
class Red : NonGeneric
{
}
Run Code Online (Sandbox Code Playgroud)
然后你的泛型类变成:
class Generic<Red> : NonGeneric
where Red : NonGeneric // constraint satisfied
{
Red DoSomething()
{
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,this是不是Red,这是Generic<Red>,这是一个不同的子类NonGeneric比Red.
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |