You can fix it with:
string x = string.IsNullOrEmpty(input) ?
input :
DBNull.Value.ToString();
I have found this excellent explanations in Eric Lippert's blog post on Type inference woes:
The specification for the ?:
operator states the following:
The second and third operands of the ?: operator control the type of
the conditional expression. Let X and Y be the types of the second and
third operands. Then,
If X and Y are the same type, then this is the type of the conditional
expression.
Otherwise, if an implicit conversion exists from X to Y,
but not from Y to X, then Y is the type of the conditional expression.
Otherwise, if an implicit conversion exists from Y to X, but not from
X to Y, then X is the type of the conditional expression.
Otherwise,
no expression type can be determined, and a compile-time error occurs.
In this case:
string
and DBNull
aren't the same type.
string
doesn't have an implicit conversion to DBNull
DBNull
doesn't have an implicit conversion to string
So we end up with a compile-time error.
The compiler doesn't check what is the type that can "hold" those two types.