Это странное поведение, о котором я не могу понять. В моем примере у меня есть класс Sample<T> и неявный оператор преобразования от T до Sample<T>.
private class Sample<T>
{
public readonly T Value;
public Sample(T value)
{
Value = value;
}
public static implicit operator Sample<T>(T value) => new Sample<T>(value);
}
Проблема возникает при использовании типа значения NULL для T такого как int? ,
{
int? a = 3;
Sample<int> sampleA = a;
}
Вот ключевая часть:
По-моему, это не должно компилироваться, потому что Sample<int> определяет преобразование из int в Sample<int> но не из int? Sample<int>. Но он компилируется и работает успешно! (Под этим я подразумеваю, что оператор преобразования вызывается, а 3 - для поля readonly.)
И это становится еще хуже. Здесь оператор преобразования не вызывается, а sampleB будет иметь значение null:
{
int? b = null;
Sample<int> sampleB = b;
}
Большой ответ, вероятно, будет разделен на две части:
- Почему код в первом фрагменте компиляции?
- Могу ли я предотвратить компиляцию кода в этом сценарии?