Swift 类型别名的 C# 等效项

Hud*_*eme 5 c# types swift

我是 C# 新手,并且习惯了 Swift,所以请耐心等待。

我想完全按照下面 Swift 代码描述的方式使用 C# 中的类型:

typealias Answer = (title: String, isCorrect: Bool)
typealias Question = (Question: String, Answers: [Answer])
Run Code Online (Sandbox Code Playgroud)

对于进一步的例子,现在使用上面的方法Question快速创建 a 是非常简单的:typealias

Question(Question: "What is this question?", Answers: [("A typedef", false), ("FooBar", false), ("I don't know", false), ("A Question!", true)])
Run Code Online (Sandbox Code Playgroud)

using到目前为止,我已经尝试使用语句并创建抽象类,但没有成功。

提前致谢。

hes*_*imu 5

该线程很旧,但我想添加一个简单的答案,因为现有的答案都不是。

C# 没有完全等价的typealias

  • Swift 中的定义typealias是持久的,可以在其他地方重用。

  • using定义仅保留在定义它的文件中。它不能用于项目的其他部分。


vin*_*ras 1

我从未使用过 Swift,但看到你的示例代码,我能记得的最接近的想法是Anonymous Types。它们允许您在声明变量并实例化其对象/值时构造一个新对象,而无需显式声明类/结构。例子:

var student = new
{
    Name = "John",
    LastName = "Doe",
    Age = 37,
    Hobbies = new [] { "Drinking", "Fishing", "Hiking" }
};
Run Code Online (Sandbox Code Playgroud)

student.LastName然后您可以通过、student.Age、 等方式访问字段。匿名类型内的属性类型由编译器推断(但如果您想强制某些属性使用特定类型,则可以使用强制转换)。

您的示例可以建模如下:

var answersArray = new[] {
    new { Title = "First answer", IsCorrect = false },
    new { Title = "Second answer", IsCorrect = true },
    new { Title = "Third answer", IsCorrect = false },
    new { Title = "Fourth answer", IsCorrect = false },
};
var questionData = new { Question = "To be or not to be?", Answers = answersArray };
Run Code Online (Sandbox Code Playgroud)

数据将以某种方式访问​​,例如:

Console.WriteLine(questionData.Question);
foreach (var answer in answersArray)
    Console.WriteLine(answer.Title);
Run Code Online (Sandbox Code Playgroud)

匿名类型的问题在于创建的对象是只读的,因此匿名类型对象的属性接收到的值在对象实例化后无法更改。

using关键字可用于您实际上已经定义了类并且希望为该类提供别名的情况,如下所示:

// The "HttpClient" class will now have an alias of "MyClient"
using MyClient = System.Net.Http.HttpClient;
Run Code Online (Sandbox Code Playgroud)

这种方法显然需要预先定义您要别名的类,所以我不知道它是否符合您的需求。

经过这些考虑之后,我想说,最佳实践(以及我的建议)实际上是在代码中实际声明类和/或结构来表示您正在使用的数据,而不是尝试模仿 Swift 的typealias.