使用值元组的属性

时间:2017-02-13 07:56:17

标签: c# functional-programming tuples resharper

在C#7.0中,.NET引入了一个新的返回值元组类型(函数式编程),因此代替:

[NotNull]
WrapperUser Lookup(int id)

我想使用值元组:

(User, Info) Lookup(int id)

我想为这些返回类型使用属性:

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

但VS2017不允许我这样做。如何在不使用包装类的情况下使用属性?

1 个答案:

答案 0 :(得分:3)

你不能。

(User, Info) Lookup(int id)

只是

的语法糖
ValueTuple<User,Info> Lookup(int id)

ValueTuple的类型参数不是属性的有效目标。除了包装类之外,您唯一的选择是将类型参数包装在NonNullable wrapper

(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插件才能完成这项工作。