Ответ 1
Я считаю, что проблема заключается в том, что компилятор не может знать тип выражения _valueProvider?.Value
.
Немного упростите это:
public interface IValueProvider<T>
{
T Value { get; }
}
public class Test
{
public static void Foo<T>(IValueProvider<T> provider)
{
var mystery = provider?.Value;
}
}
Что должен компилятор выводить тип mystery
?
-
Если
T
является ссылочным типом или типом значения NULL, для выражения (и, следовательно,mystery
) было бы иметь типT
. -
Если
T
- тип значений, не допускающих нулевой, для выражения (и, следовательно,mystery
) было бы иметь типT?
.
Поскольку нет ограничений на T
, нет подходящего типа для использования, поэтому есть сообщение (немного неудачное).
Если свойство было типа string
, int
или int?
, все они были бы точными, и выражение было бы типа string
, int?
и int?
соответственно. Но нет эквивалента этого для T
.
Если вы ограничиваете T
ссылочным типом, это нормально, а выражение имеет тип T
:
public static void Foo<T>(IValueProvider<T> provider) where T : class
{
// Variable is of type T
var mystery = provider?.Value;
}
Если вы ограничиваете T
недействительным типом значения, это отлично, а выражение имеет тип T?
(aka Nullable<T>
).
public static void Foo<T>(IValueProvider<T> provider) where T : struct
{
// Variable is of type Nullable<T>
var mystery = provider?.Value;
}
Но без какого-либо ограничения нет действительного перевода.