使用值元组的属性

MiP*_*MiP 14 c# resharper functional-programming tuples

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

[NotNull]
WrapperUser Lookup(int id)
Run Code Online (Sandbox Code Playgroud)

我想使用值元组:

(User, Info) Lookup(int id)
Run Code Online (Sandbox Code Playgroud)

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

([NotNull] User, [CanBeNull] Info) Lookup(int id)
Run Code Online (Sandbox Code Playgroud)

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

RoX*_*oXX 6

你不能。

(User, Info) Lookup(int id)
Run Code Online (Sandbox Code Playgroud)

只是语法糖

ValueTuple<User,Info> Lookup(int id)
Run Code Online (Sandbox Code Playgroud)

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

(NonNullable<User>,NonNullable<Info>) Lookup(int id)
Run Code Online (Sandbox Code Playgroud)

这允许您像平常一样使用它ValueTuple,例如

(NonNullable<User>,NonNullable<Info>) Lookup(int id) => (new User(), new Info());
(User user, Info info) = Lookup(5);
Run Code Online (Sandbox Code Playgroud)

否则,您可以将自定义属性粘贴到整个数组中,ValueTuple指示哪些元组元素可以null与数组一起使用,就像TupleElementNamesAttribute用于为元组元素分配名称的属性一样。您必须编写自己的 Visual Studio / resharper 插件来完成这项工作。