Возможно реализовать неявный оператор приведения , но только для определенных вами типов или из них. Например, делать что-то вроде этого ..
public class NullableExtensions
{
public static implicit operator int(int? value)
{
return value ?? default(int);
}
}
.. вернет CS0556 ошибку компиляции, потому что приведение не включает определенный пользователем тип.
Самое близкое, что вы можете сделать, это определить свой собственный тип Nullable, который содержит неявный оператор приведения:
public struct ImplicitNullable<T> where T: struct
{
public bool HasValue { get { return this._value.HasValue; } }
public T Value { get { return this._value.Value; } }
public ImplicitNullable(T value) : this() { this._value = value; }
public ImplicitNullable(Nullable<T> value) : this() { this._value = value; }
public static implicit operator ImplicitNullable<T>(T value) { return new ImplicitNullable<T>(value); }
public static implicit operator ImplicitNullable<T>(Nullable<T> value) { return new ImplicitNullable<T>(value); }
public static implicit operator T(ImplicitNullable<T> value) { return value._value ?? default(T); }
public static implicit operator Nullable<T>(ImplicitNullable<T> value) { return value._value; }
private Nullable<T> _value { get; set; }
// Should define other Nullable<T> members, especially
// Equals and GetHashCode to avoid boxing
}
Обратите внимание, что хотя этот код можно написать, он, вероятно, приведет к трудным отслеживанию ошибок. Я бы порекомендовал использовать явное приведение или генерировать исключение при значении null
.
После этого вы можете кастовать в и из ожидаемого:
static void Main()
{
int myInt = 1;
int? nullableInt = 2;
ImplicitNullable<int> implicitInt;
// Convert from int or int?
implicitInt = myInt;
implicitInt = nullableInt;
// Convert to int or int?
myInt = implicitInt;
nullableInt = implicitInt;
}