What does exclamation mark mean before invoking a method in C# 8.0? [duplicate]
This would be the null forgiving operator.
It tells the compiler "this isn't null, trust me", so it does not issue a warning for a possible null reference.
In this particular case it tells the compiler that Entity
isn't null.
!
is the Null-Forgiving Operator. To be specific it has two main effects:
-
it changes the type of the expression (in this case it modifies
Entity
) from a nullable type into a non-nullable type; (for example,object?
becomesobject
) -
it suppresses nullability related warnings, which can hide other conversions
This seems to come up particularly with type parameters:
IEnumerable<object?>? maybeListOfMaybeItems = new object[] { 1, 2, 3 };
// inferred as IEnumerable<object?>
var listOfMaybeItems = maybeListOfMaybeItems!;
// no warning given, because ! supresses nullability warnings
IEnumerable<object> listOfItems = maybeListOfMaybeItems!;
// warning about the generic type change, since this line does not have !
IEnumerable<object> listOfItems2 = listOfMaybeItems;
This is called the null-forgiving operator and is available in C# 8.0 and later. It has no effect at run time, only at compile time. It's purpose is to inform the compiler that some expression of a nullable type isn't null to avoid possible warnings about null references.
In this case it tells the compiler that Entity
isn't null.