Игра с новыми обнуляемыми ссылочными типами в C#. Рад видеть, что они взломали это от Свифта! Это такая замечательная особенность! НО ... так как он по сути "привязан" к языку, я изо всех сил пытаюсь создать универсальный 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 (т. Е. Int?), И ссылочные типы Nullable (т. Е. 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; }
}
Обратите внимание, я также пытался думать, что обнуляемость можно просто передать как фактический параметр типа. , но потом жалуется, что «Значение» не установлено.
public abstract class LabeledValue<TValue> {
public string? label { get; set; }
public TValue value { get; set; }
}
public class LabeledInt : LabeledValue<Int?>{}