Используйте атрибуты для кортежей значений
В C# 7.0.NET вводит новые типы кортежей возвращаемого значения (функциональное программирование), поэтому вместо:
[NotNull]
WrapperUser Lookup(int id)
Я хотел бы использовать кортежи значений:
(User, Info) Lookup(int id)
И я хочу использовать атрибуты для этих типов возврата:
([NotNull] User, [CanBeNull] Info) Lookup(int id)
Но VS2017 не позволяет мне это сделать. Как я могу использовать атрибуты без использования класса-обертки?
1 ответ
Ты не можешь
(User, Info) Lookup(int id)
это просто синтаксический сахар для
ValueTuple<User,Info> Lookup(int id)
Параметры типа ValueTuple
не являются допустимыми целями для атрибутов. Единственный вариант, кроме класса-обертки, - это обернуть параметры типа в ненулевой обертке.
(NonNullable<User>,NonNullable<Info>) Lookup(int id)
что позволяет использовать его так же, как обычный ValueTuple
например,
(NonNullable<User>,NonNullable<Info>) Lookup(int id) => (new User(), new Info());
(User user, Info info) = Lookup(5);
В противном случае вы можете прикрепить пользовательский атрибут ко всему ValueTuple
указывающий, какие элементы кортежа могут быть null
с массивом, как TupleElementNamesAttribute
это используется для присвоения имен элементам кортежа. Вы должны написать свой собственный плагин visual studio / resharper, который выполняет всю работу.