C# 中有没有办法定义保存元组的自定义类型?例如:
Type MyParams Tuple<string, string>?
动机:我在父类中有以下函数:
protected virtual IEnumerable<(string, string)> GetConfigs()
Run Code Online (Sandbox Code Playgroud)
这将被每个子类覆盖。我正在寻找一种方法将该元组定义为类型以声明返回类型,而IEnumerable<Params>不是复制元组。
global using MyParams = System.ValueTuple<string, string>;
Run Code Online (Sandbox Code Playgroud)
从 C#12 开始,您可以为任何类型创建别名,即也可以为ValueTuples创建别名:
global using MyParams = (string key , string value);
Run Code Online (Sandbox Code Playgroud)
此全局使用必须先于using文件中的任何其他使用。C# 12 之前的版本不允许使用 C# 元组语法创建别名(string a, string b)。因此,您必须使用等访问元组元素t.Item1。t.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)