c# - el operador || no se puede aplicar a operandos del tipo bool y string
Operador ''?'' No se puede aplicar al operando de tipo ''T'' (3)
Dado que no todo puede ser null
, debe restringir T
para ser algo que pueda contener null
(también conocido como object
). Las estructuras no pueden ser nulas, ni tampoco las enumeraciones.
Agregar un where
en la class
soluciona el problema:
public abstract class Feature<T> where T : class
Entonces, ¿por qué no funciona?
Invoke()
produce T
Si GetValue
es null
, el ?
operador establece el valor de retorno de tipo T
en null
, que no puede. Si T
es int
por ejemplo, no puede ser anulable ( int?
) Ya que el tipo real requerido ( T
= int
) no lo es.
Si cambia T
para que sea int
en su código, verá el problema muy claramente. El resultado final de lo que pides es este:
get
{
int? x = GetValue?.Invoke();
return x.GetValueOrDefault(0);
}
Esto no es algo que el operador de propagación de nulos hará por usted. Si vuelve a utilizar el default(T)
, sabe exactamente qué hacer y evita la propagación nula "problemática".
Tratando de hacer Feature
genérica y luego de repente compilador dijo
Operador ''?'' No se puede aplicar al operando de tipo ''T''
Aquí está el código
public abstract class Feature<T>
{
public T Value
{
get { return GetValue?.Invoke(); } // here is error
set { SetValue?.Invoke(value); }
}
public Func<T> GetValue { get; set; }
public Action<T> SetValue { get; set; }
}
Es posible utilizar este código en su lugar
get
{
if (GetValue != null)
return GetValue();
return default(T);
}
Pero me pregunto cómo arreglar ese bonito C # 6.0 de una sola línea.
Por lo que yo sé el ?.
El operador está codificado para trabajar con null
, es decir, funciona para tipos de referencia o tipos de valores que admiten valores null
, pero no para tipos de valores normales . El problema es probable que el operador devuelva null
si la expresión era null
lugar de default(T)
.
Es posible que pueda solucionarlo restringiendo T
a la class
aquí.
T
debe ser un tipo de referencia o un tipo anulable
public abstract class Feature<T> where T : class
{
// ...
}