Это странное поведение, о котором я не могу понять. В моем примере у меня есть класс 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;
}
Большой ответ, вероятно, будет разделен на две части:
- Почему код в первом фрагменте компиляции?
- Могу ли я предотвратить компиляцию кода в этом сценарии?