Игра с новыми ссылочными типами, допускающими значение NULL, в C #. Рад видеть, что они переманили это у Свифта! Это такая замечательная функция! НО ... поскольку он по сути «привязан» к языку, я изо всех сил пытаюсь создать универсальный тип, который может принимать любой обнуляемый тип, будь то значение или ссылка, что тривиально в Swift.
Рассмотрим этот класс:
public abstract class LabeledValue<TValue> {
public string? label { get; set; }
public TValue? value { get; set; }
}
Вот чего я пытаюсь достичь, используя Int
и класс под названием 'Foo' в качестве примера:
public class LabeledInt : LabeledValue<Int>{}
var myLabeledIntA = new LabeledInt(){
label = "Forty Four",
value = 44
}
var myLabeledIntB = new LabeledInt(){
label = "Not Set",
value = null
}
public class LabeledFoo : LabeledValue<Foo>{}
var myLabeledFooA = new LabeledFoo(){
label = "Set",
value = new Foo()
}
var myLabeledFooB = new LabeledFoo(){
label = "Not Set",
value = null
}
Он жалуется, что мне нужно определить TValue как допускающее значение NULL. Однако я не могу найти ограничение, которое разрешает как типы значений, допускающие значение NULL (например, Int?), Так и ссылочные типы, допускающие значение NULL (например, Foo?). Как написать такое ограничение?
Это не работает ...
public abstract class LabeledValue<TValue>
where TValue : Nullable {
public string? label { get; set; }
public TValue? value { get; set; }
}
public abstract class LabeledValue<TValue>
where TValue : struct {
public string? label { get; set; }
public TValue? value { get; set; }
}
public abstract class LabeledValue<TValue> {
public string? label { get; set; }
public Nullable<TValue> value { get; set; }
}
Обратите внимание, я также пробовал это, думая, что допускаемое значение NULL можно просто передать как фактический параметр типа, но затем он жалуется, что «Значение» не установлено.
public abstract class LabeledValue<TValue> {
public string? label { get; set; }
public TValue value { get; set; }
}
public class LabeledInt : LabeledValue<Int?>{}
Nullable<T>
- это структура и тип значения, ссылки, допускающие значение NULL, явно предназначены для ссылочных типов. Вы должны использовать общее ограничениеclass
илиstruct
, как это объясняется в разделеissue with T?
в этом статья - person Pavel Anikhouski   schedule 14.01.2020TValue?
когдаTValue: class
и когдаTValue: struct
- это совершенно разные вещи с точки зрения CLR, обнуляемый ссылочный тип аннотируется с использованием атрибутов, обнуляемый тип значений - этоNullable<T>
тип. Вы должны сами обдумать, чего вы хотите в этом случае. Или украсить шрифт атрибутами до и после состояния - person Pavel Anikhouski   schedule 14.01.2020Optional<T>
, поэтому они одного типа, следовательно, это разрешено. - person Mark A. Donohoe   schedule 14.01.2020