C# 将元组定义为类型

Ahm*_*lha 4 c# types tuples

C# 中有没有办法定义保存元组的自定义类型?例如:

Type MyParams Tuple<string, string>

动机:我在父类中有以下函数:

protected virtual IEnumerable<(string, string)> GetConfigs()
Run Code Online (Sandbox Code Playgroud)

这将被每个子类覆盖。我正在寻找一种方法将该元组定义为类型以声明返回类型,而IEnumerable<Params>不是复制元组。

Oli*_*bes 7

此全局使用必须先于using文件中的任何其他使用。C# 12 之前的版本不允许使用 C# 元组语法创建别名(string a, string b)。因此,您必须使用等访问元组元素t.Item1t.Item2

如果省略global关键字 (C# 10+),则指令的范围仅限于当前文件。

现在您可以将该方法声明为

protected virtual IEnumerable<MyParams> GetConfigs()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

笔记; 但是,这种全局使用仅在当前程序集中已知!

因此,它在类库的公共API中的使用受到限制。

仍然可以使用此类型访问此库的成员,因此。

在一个程序集中包含此声明

global using MyParams = System.ValueTuple<string, string>;

namespace MyLibrary;

public class Class1
{
    public MyParams p = ("hello", "world");
}
Run Code Online (Sandbox Code Playgroud)

您可以在另一个引用第一个程序集中编写此代码:

var obj = new MyLibrary.Class1();
Console.WriteLine(obj.p);
Run Code Online (Sandbox Code Playgroud)

MyLibrary.MyParams p;但在其他程序集中不可能进行类似的声明。


小智 5

您正在寻找的称为alias usingdirective。但是,根据文档,您可以从 C# 10 开始使用全局范围来定义它。否则,当您想要使用它时,您需要在每个文件中创建一个别名。

using MyParams = System.Tuple<string, string>;
Run Code Online (Sandbox Code Playgroud)

用法:

var foo = new MyParams("foo", "baz");
Run Code Online (Sandbox Code Playgroud)