2014-01-29 64 views
3

鉴于这种虚构的例子:为什么我不能将派生泛型类型转换为基类非泛型类型(通过约束)?

class NonGeneric 
{ 
} 

class Generic<T> : NonGeneric 
    where T : NonGeneric 
{ 
    T DoSomething() 
    { 
     return this; // ** 
    } 
} 

我希望它编译:Generic<T>NonGenericT派生必须在一个派生类,所以它满足其约束。

我应该能够做到这一点:

NonGeneric obj = new Generic<NonGeneric>(); 

那么就应该有这个指令没有问题:

return this; 

或者至少是这样的:

return (T)this; 

不幸的是,不起作用,上面的示例不会编译错误:

Cannot convert type NonGeneric<T> to ' T '

我做错了什么,我看不到它,或者它只是不被允许?为什么这个?


我将避免,如果可能的话,像一个解决方法的任何我描述in this post(反射,动态编译的方法等)。我也会避免dynamic对象(设计决定,我不能改变)。

回答

2

你试过这个吗?

T DoSomething() 
{ 
    return this as T; 
} 

this是不是隐含一样T所以有必要将它转换为明确地在上面的例子。

+0

你是对的,即使我不明白原因,它也可以工作。我期望“(T)这个”工作(如果滥用,抛出“InvalidCastException”)。我真的无法想象,为什么“as”的作用与它应该像普通演员一样。 –

7

thisNonGenericTNonGeneric,但this不一定T。从编译器的角度来看,它们可能是不同的子类。

考虑类:

class Red : NonGeneric 
{ 
} 

那么你的泛型类变为:

class Generic<Red> : NonGeneric 
    where Red : NonGeneric // constraint satisfied 
{ 
    Red DoSomething() 
    { 
     return this; 
    } 
} 

thisRed,这是Generic<Red>,这是一个不同的子类的NonGenericRed

相关问题