Nonnullable<T> is not bad, it's close to the latin Nonnullus which looks and sounds beautiful. That said, personally speaking, there is an strange eerie funny attraction to Unnullable<T>. Anyway, that's naming...
Actually for non-nullability, we'd probably want two things
- definition-site non-nullability annotation
- use-site non-nullability annotation
And preferably we want these to be low-impact in terms of syntax.
Example 1: use-site non-nullability (ejecting null from the domain of Tuple<int,int>)
Tuple<int,int>! thouShaltNull = Tuple.Create(10,20);
Example 2: definition-site non-nullability (giving birth to a new type that is non-nullable)
public class Tuple<int,int>!
{
...
}
Example 3: use-site nullability of a reference type which is born non-nullable
UnnullableTuple<int,int>? thouMayNull = ...;
It will be forbidden to construct a combination such as
Unnullable<Nullable<Val>> ...
Nullable<Unnullable<Ref>> ...
where Val is some value-type (non-nullable) and Ref is some reference type (nullable); so that the inner type is born (un-)nullable and at use-site you create a double negation.
Same as
Val?! ...
Ref!? ...
It is also forbidden to create unnnullable+unnullable and nullable+nullable combinations.