2017-02-13 61 views
10

W języku C# 7.0 NET wprowadza nowe typy krotka wartości zwracanej (programowanie funkcjonalne), więc zamiast:Wykorzystanie atrybutów krotki wartości

[NotNull] 
WrapperUser Lookup(int id) 

Chciałbym użyć krotki wartości:

(User, Info) Lookup(int id) 

I chcę używać atrybutów dla tego rodzaju powrotów:

([NotNull] User, [CanBeNull] Info) Lookup(int id) 

Ale VS2017 nie pozwala mi to zrobić. Jak mogę używać atrybutów bez użycia klasy opakowania?

Odpowiedz

1

Nie możesz.

(User, Info) Lookup(int id) 

jest po prostu cukier syntaktyczny dla

ValueTuple<User,Info> Lookup(int id) 

Parametry Rodzaj ValueTuple nie są ważne cele dla atrybutów. Jedyną opcją oprócz klasy otoki jest owinąć parametry wpisać NonNullable wrapper

(NonNullable<User>,NonNullable<Info>) Lookup(int id) 

który pozwala używać go tak, jak normalna ValueTuple, np

(NonNullable<User>,NonNullable<Info>) Lookup(int id) => (new User(), new Info()); 
(User user, Info info) = Lookup(5); 

przeciwnym razie można trzymać atrybut niestandardowy dla całego ValueTuple wskazaniem, które elementy krotkowe może być null z tablicy, jak TupleElementNamesAttribute, który jest używany do przypisywania nazw elementów krotki. Trzeba by napisać własną wtyczkę visual studio/resharper, która wykonuje pracę.