2011-08-31 26 views
6

Quería codificar un método de ayuda en el proyecto de prueba de la unidad, que inicializará al presentador para configurar la instancia de vistas y establecer el estado del presentador.El parámetro de tipo no se puede usar con los argumentos de tipo

Me lanzó la excepción:

el parámetro de tipo no se puede utilizar con argumentos de tipo

Código:

public static **TPresenter<TView>** Initialize<TPresenter,TView>() 
    where TPresenter: BasePresenter<TView>, new() 
    where TView : new() 
{ 
} 

Después de un par de minutos me encontré con el problema fue con mi tipo de devolución TPresenter<Tview>

He leído algunas publicaciones que no explicaron claramente Por qué no puedo decir T1<T2>

Me vi forzado a realizar la asignación del presentador a través del parámetro de referencia. ¡Cualquier explicación es bienvenida!

+3

¿Por qué no simplemente devuelve 'TPresenter'? Ya está restringido a un tipo que obliga a la especialización a 'TView' (a través de' BasePresenter <> '). –

+0

estaba esperando para evitar un reparto en el lado de la persona que llama! ¡Suponiendo que logre T1 ! aunque podría haberme conformado con el tipo de devolución del presentador inicialmente no estaba realmente convencido de por qué T1 con todas las condiciones mencionadas no pueden ayudar a compilar la validación del tiempo. – ioWint

Respuesta

9

Básicamente no hay manera de decir que es un parámetro de tipo en sí un tipo genérico con un número determinado de parámetros de tipo - que se necesita para ser capaz de hacer con el fin de hacer TPresenter<TView> tiene sentido.

No está claro a qué se refiere al hacer que funcione a través de un parámetro de referencia; cualquier tipo que utilice para ese parámetro de ref debería estar bien como un tipo de devolución también. Supongo que fue solo del tipo TPresenter, no TPresenter<TView>.

+0

sí, fue TPresenter – ioWint

+0

@ioWint: Correcto, así que simplemente haga que sea el tipo de devolución. –

+1

Sí, podría, pensé evitar un reparto explícito en el lado de la persona que llama. nunca me molestó hasta ahora con un T1 , teóricamente esperaba que si todas las condiciones en las que están dadas deberían ser buenas. – ioWint

1

No existe tal cosa como TPresenter<TView>, no tiene sentido. TPresenter es solo un marcador de posición, hasta que esté restringido por donde podría haber algo, p. Ej. no hay int<tview> así que no puedes tener eso. Una vez que agregue la restricción, significa que tiene que ser un BasePresenter<TView> o algún tipo derivado, por lo que siempre será un Something<TView>, así que de nuevo TPresenter<TView> no tiene sentido.

+0

entiendo que podría confundir int pero especifico mis limitaciones que TPresenter es de BasePresenter y TInterface es clase.¿Esto no será suficiente para garantizar que las cosas estén bien @ tiempo de compilación? – ioWint

+1

El punto es que la restricción dice que TPresenter debe ser BasePresenter o algo derivado de él, por lo que su tipo de devolución es solo TPresenter –

0

Esta es una antigua, pero yo también la golpeé. En la definición de Clase, simplemente use el tipo único, luego múltiples tipos donde lo usa. E.g:

public class Template1<T>{} 

void SomeFunc() 
{ 
    <Template1<SomeClass1,SomeClass2>> someValue = new <Template1<SomeClass1,SomeClass2>>() 
} 

//or even: 
void SomeOtherFunc<U,V>() 
{ 
    <Template1<U,V>> someValue = new <Template1<U,V>>(); 
} 
0

Estaba obteniendo un error similar en mi código. @Jon Skeet indica correctamente la dirección correcta. El tipo de devolución ya es genérico, como se especifica en TPresenter : BasePresenter<TView>. Entonces podemos simplemente usarlo como TPresenter en lugar de TPresenter<TView>.

public class BasePresenter<T> 
{ 

} 

public class Demo 
{ 
    public static TPresenter Initialize<TPresenter, TView>() where TPresenter: BasePresenter<TView>, new() 
    { 
     return null; 
    } 
} 
Cuestiones relacionadas