Используйте атрибуты для кортежей значений

В 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, который выполняет всю работу.

Другие вопросы по тегам