tipo puede operandos operador bool aplicar c# generics delegates c#-6.0 null-propagation-operator

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 { // ... }