Clase genérica con tipos nullables

01/01/2008 - 01:24 por Clara | Informe spam
Hola,

No es posible definir una clase que genèrica que acepte tipos nullables?

algo asi:

class P <T>
{
private T _i1;
private T _i2;

public P (T i1, T i2) {_i1 = i1; _i2 = i2;}

public bool Error {
get {
if (_i1.HasValue && _i2.HasValue) //Esto no compila.
{

}
}

Tengo una clase con dos campos privados del tipo decimal?, (en el ejemplo T
seria decimal?). Y esta misma clase la queria hacer genérica, puesto que la
tengo que repetir con valores tipos DateTime?, Int?, ... pero por lo que
veo, no se puede.
O si?

Grácias.

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
01/01/2008 - 12:08 | Informe spam
Hola!

No, el tipo genérico no puede ser anulable.
Puedes hacer lo que quieres haciendo que el tipo genérico sea la versión
"no anulable" del que pensabas, y gestionar la "nulidad" dentro de la propia
clase:

class P<T> where T: struct
{
private T? _i1;
private T? _i2;

public P(T? i1, T? i2) { _i1 = i1; _i2 = i2; }

public bool Error
{
get
{
return _i1 == null || _i2 == null;
}
}

public static bool Test1()
{
P<int> parDeEnteros = new P<int>(3, null);
return !parDeEnteros.Error;
}
}


Slds - Octavio


"Clara" wrote in message
news:%
Hola,

No es posible definir una clase que genèrica que acepte tipos nullables?

algo asi:

class P <T>
{
private T _i1;
private T _i2;

public P (T i1, T i2) {_i1 = i1; _i2 = i2;}

public bool Error {
get {
if (_i1.HasValue && _i2.HasValue) //Esto no compila.
{

}
}

Tengo una clase con dos campos privados del tipo decimal?, (en el ejemplo
T
seria decimal?). Y esta misma clase la queria hacer genérica, puesto que
la
tengo que repetir con valores tipos DateTime?, Int?, ... pero por lo que
veo, no se puede.
O si?

Grácias.


Respuesta Responder a este mensaje
#2 Clara
01/01/2008 - 12:21 | Informe spam
Hola Octavio, buen año!

Grácias por la respuesta. Pero el problema es que la clase DEBE poder
almacenar nulos.
Esta clase guarda dos valores que forman parte de filtros.
en el caso de Decimal?, si el primer valor es nulo y el segundo es que se
trata de un filtro tipo "<=SegundoValor"
Si el primero no es nulo y el segundo si, seria del tipo ">=PrimerValor" . Y
si nnguno es nulo seria ">=PrimerValor y <=SegundoValor"

Pero para que esto funcione, deberia poder almacenar nulos en las variables
de la clase.
La funcion que puse de ejemplo "Error", lo único que hacia era comprobar que
el Valor1 no fuera mayor que Valor2 para que un filtro del tipo ">=Valor1 y
<=Valor2" tuviera sentido.

Saludos.


"Octavio Hernandez" escribió en el mensaje
news:%
Hola!

No, el tipo genérico no puede ser anulable.
Puedes hacer lo que quieres haciendo que el tipo genérico sea la versión
"no anulable" del que pensabas, y gestionar la "nulidad" dentro de la


propia
clase:

class P<T> where T: struct
{
private T? _i1;
private T? _i2;

public P(T? i1, T? i2) { _i1 = i1; _i2 = i2; }

public bool Error
{
get
{
return _i1 == null || _i2 == null;
}
}

public static bool Test1()
{
P<int> parDeEnteros = new P<int>(3, null);
return !parDeEnteros.Error;
}
}


Slds - Octavio


"Clara" wrote in message
news:%
> Hola,
>
> No es posible definir una clase que genèrica que acepte tipos nullables?
>
> algo asi:
>
> class P <T>
> {
> private T _i1;
> private T _i2;
>
> public P (T i1, T i2) {_i1 = i1; _i2 = i2;}
>
> public bool Error {
> get {
> if (_i1.HasValue && _i2.HasValue) //Esto no compila.
> {
>
> }
> }
>
> Tengo una clase con dos campos privados del tipo decimal?, (en el


ejemplo
> T
> seria decimal?). Y esta misma clase la queria hacer genérica, puesto que
> la
> tengo que repetir con valores tipos DateTime?, Int?, ... pero por lo que
> veo, no se puede.
> O si?
>
> Grácias.
>
>


Respuesta Responder a este mensaje
#3 Octavio Hernandez
01/01/2008 - 18:07 | Informe spam
Clara,

Mi clase almacena nulos, ¿no?
Los campos son de tipo T?. Y el constructor recibe dos T?.

Slds - Octavio


"Clara" wrote in message
news:
Hola Octavio, buen año!

Grácias por la respuesta. Pero el problema es que la clase DEBE poder
almacenar nulos.
Esta clase guarda dos valores que forman parte de filtros.
en el caso de Decimal?, si el primer valor es nulo y el segundo es que se
trata de un filtro tipo "<=SegundoValor"
Si el primero no es nulo y el segundo si, seria del tipo ">=PrimerValor" .
Y
si nnguno es nulo seria ">=PrimerValor y <=SegundoValor"

Pero para que esto funcione, deberia poder almacenar nulos en las
variables
de la clase.
La funcion que puse de ejemplo "Error", lo único que hacia era comprobar
que
el Valor1 no fuera mayor que Valor2 para que un filtro del tipo ">=Valor1
y
<=Valor2" tuviera sentido.

Saludos.


"Octavio Hernandez" escribió en el mensaje
news:%
Hola!

No, el tipo genérico no puede ser anulable.
Puedes hacer lo que quieres haciendo que el tipo genérico sea la versión
"no anulable" del que pensabas, y gestionar la "nulidad" dentro de la


propia
clase:

class P<T> where T: struct
{
private T? _i1;
private T? _i2;

public P(T? i1, T? i2) { _i1 = i1; _i2 = i2; }

public bool Error
{
get
{
return _i1 == null || _i2 == null;
}
}

public static bool Test1()
{
P<int> parDeEnteros = new P<int>(3, null);
return !parDeEnteros.Error;
}
}


Slds - Octavio


"Clara" wrote in message
news:%
> Hola,
>
> No es posible definir una clase que genèrica que acepte tipos
> nullables?
>
> algo asi:
>
> class P <T>
> {
> private T _i1;
> private T _i2;
>
> public P (T i1, T i2) {_i1 = i1; _i2 = i2;}
>
> public bool Error {
> get {
> if (_i1.HasValue && _i2.HasValue) //Esto no compila.
> {
>
> }
> }
>
> Tengo una clase con dos campos privados del tipo decimal?, (en el


ejemplo
> T
> seria decimal?). Y esta misma clase la queria hacer genérica, puesto
> que
> la
> tengo que repetir con valores tipos DateTime?, Int?, ... pero por lo
> que
> veo, no se puede.
> O si?
>
> Grácias.
>
>






Respuesta Responder a este mensaje
#4 Alberto Poblacion
01/01/2008 - 18:41 | Informe spam
"Clara" wrote in message
news:%
No es posible definir una clase que genèrica que acepte tipos nullables?

algo asi:

class P <T>
{
private T _i1;
private T _i2;

public P (T i1, T i2) {_i1 = i1; _i2 = i2;}

public bool Error {
get {
if (_i1.HasValue && _i2.HasValue) //Esto no compila.
{

}
}




Podrías hacerlo pasando en T el tipo-valor sobre el que se construye el
tipo anulable, en lugar del propio tipo anulable:

class P <T> where T:struct
{
private Nullable<T> _i1;
private Nullable<T> _i2;

public P (Nullable<T> i1, Nullable<T> i2) {_i1 = i1; _i2 = i2;}

public bool Error
{
get
{
if (_i1.HasValue && _i2.HasValue) //Esto no compila.
{
return false;
}
return true;
}
}
}
Respuesta Responder a este mensaje
#5 Clara
01/01/2008 - 19:02 | Informe spam
Perdona Octavio!!!
Que mal he leido!!!

Si. Es exactamente lo que queria!!!
Ahora se me presenta otro problema
teniendo tu clase, el método error seria:
public bool Error
{
get
{
if (_i1 != null && _i2 != null)
return _i1 > _i2; //No se puede aplicar el operador > a
_i1 y _i2
return false;
}
}

Como podria hacer la comparacion ">" entre las variables _i1 y _i2? he
probado con (T)_i1 > (T)_i2 o (T?)_i1 > (T?)_i2, pero nada.
Muchas grácias!!!



"Octavio Hernandez" escribió en el mensaje
news:%
Clara,

Mi clase almacena nulos, ¿no?
Los campos son de tipo T?. Y el constructor recibe dos T?.

Slds - Octavio


"Clara" wrote in message
news:
> Hola Octavio, buen año!
>
> Grácias por la respuesta. Pero el problema es que la clase DEBE poder
> almacenar nulos.
> Esta clase guarda dos valores que forman parte de filtros.
> en el caso de Decimal?, si el primer valor es nulo y el segundo es que


se
> trata de un filtro tipo "<=SegundoValor"
> Si el primero no es nulo y el segundo si, seria del tipo ">=PrimerValor"


.
> Y
> si nnguno es nulo seria ">=PrimerValor y <=SegundoValor"
>
> Pero para que esto funcione, deberia poder almacenar nulos en las
> variables
> de la clase.
> La funcion que puse de ejemplo "Error", lo único que hacia era comprobar
> que
> el Valor1 no fuera mayor que Valor2 para que un filtro del tipo


">=Valor1
> y
> <=Valor2" tuviera sentido.
>
> Saludos.
>
>
> "Octavio Hernandez" escribió en el


mensaje
> news:%
>> Hola!
>>
>> No, el tipo genérico no puede ser anulable.
>> Puedes hacer lo que quieres haciendo que el tipo genérico sea la


versión
>> "no anulable" del que pensabas, y gestionar la "nulidad" dentro de la
> propia
>> clase:
>>
>> class P<T> where T: struct
>> {
>> private T? _i1;
>> private T? _i2;
>>
>> public P(T? i1, T? i2) { _i1 = i1; _i2 = i2; }
>>
>> public bool Error
>> {
>> get
>> {
>> return _i1 == null || _i2 == null;
>> }
>> }
>>
>> public static bool Test1()
>> {
>> P<int> parDeEnteros = new P<int>(3, null);
>> return !parDeEnteros.Error;
>> }
>> }
>>
>>
>> Slds - Octavio
>>
>>
>> "Clara" wrote in message
>> news:%
>> > Hola,
>> >
>> > No es posible definir una clase que genèrica que acepte tipos
>> > nullables?
>> >
>> > algo asi:
>> >
>> > class P <T>
>> > {
>> > private T _i1;
>> > private T _i2;
>> >
>> > public P (T i1, T i2) {_i1 = i1; _i2 = i2;}
>> >
>> > public bool Error {
>> > get {
>> > if (_i1.HasValue && _i2.HasValue) //Esto no compila.
>> > {
>> >
>> > }
>> > }
>> >
>> > Tengo una clase con dos campos privados del tipo decimal?, (en el
> ejemplo
>> > T
>> > seria decimal?). Y esta misma clase la queria hacer genérica, puesto
>> > que
>> > la
>> > tengo que repetir con valores tipos DateTime?, Int?, ... pero por lo
>> > que
>> > veo, no se puede.
>> > O si?
>> >
>> > Grácias.
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida