Dadas las siguientes clases ...¿Por qué no se pueden inferir los tipos genéricos anidados?
public abstract class FooBase<TBar> where TBar : BarBase{}
public abstract class BarBase{}
public class Bar1 : BarBase{}
public class Foo1 : FooBase<Bar1> {}
... y el siguiente método ...
public TBar DoSomething<TFoo, TBar>(TFoo theFoo)
where TFoo : FooBase<TBar>
where TBar : BarBase
{
return default(TBar);
}
Por qué no puede la siguiente línea de código implica el tipo de retorno?
Bar1 myBar = DoSomething(new Foo1());
En lugar de eso tienen que especificar los tipos genéricos como esto ...
Bar1 myBar = DoSomething<Foo1, Bar1>(new Foo1());
Creo que algunas personas se preguntarán por qué no ** probaremos ** usar la restricción para inferir el tipo. Otra forma de pensar sobre esto, es que si considera primero debemos determinar qué tipos concretos se están utilizando para TFoo y TBar, entonces cualquier código que haga referencia a esos tipos ahora usa el tipo concreto. En el caso de 'FooBase', aquí estamos diciendo ** después ** sabes qué tipo 'TBar' es, entonces' FooBase 'se convertirá en 'FeeBase '. Esta restricción no se puede usar como parte de la inferencia de tipo, porque no conocemos el tipo hasta que se complete la inferencia. Sería lógica circular. –
AaronLS