vb.net - C# 和 VB 中类型参数差异的语法选择

标签 vb.net c#-4.0 syntax language-design language-features

在C#和VB中,都使用类型参数修饰符来表示类型参数的变化。例如,C# 版本如下所示:

interface Foo<in X, out Y> { }

VB 版本如下所示:

Interface Foo(Of In X, Out Y)

End Interface

由于变体规范基本上限制了类型参数的使用位置和方式,我倾向于将它们视为对类型参数的额外约束。

我很好奇为什么他们没有这样表示。我的意思是,为什么它们在两种语言中都表示为类型参数的附加修饰符,而不是添加到类型约束列表中?如果它们是类型约束,C# 版本会是这样的:

interface Foo<X, Y> where X:in where Y:out { }

VB 版本应该是这样的:

Interface Foo(Of X As In, Y As Out)

End Interface

那么,有人知道在这些语言中表达类型参数差异的特定语法选择背后是否存在某种推理,还是只是随机的?

最佳答案

我认为语言设计者在这里做出了很好的选择。

这样做的原因是协变和逆变不是对类型(在您的情况下是 X/Y)的约束,而是对接口(interface)本身的约束。

如果您使用了 where X: inOf X As In 语法,则表示您建议对类型 X 进行约束。然而,协变和逆变实际上是对接口(interface)本身的“约束”——接口(interface)的泛型类型将如何使用类型“T”。例如,通过说:

interface Foo<out X> {}

你说的是“这个接口(interface)只使用 X 作为输出”,这实际上是在说你限制了你的对 X 的使用 以允许协变的方式。

这与说“X 需要限制为特定类型”非常不同,因为这不是对 X 的限制。

通过引入新的语法,语言设计者允许我们通过不混合消息来更有效地概念化这一点。

关于vb.net - C# 和 VB 中类型参数差异的语法选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2623707/

相关文章:

vb.net 专用/重载泛型

c# - USB 设备已连接

xml - 如何防止 xsd 生成的类被命名为 "NewDataSet"?

php smarty 语法错误

HTML5 和短结束标签

python - . argparse 参数和变量名称中的(点)

mysql - 有没有办法使用 .NET 应用程序为 Web 托管的 MySQL 数据库提供数据?

asp.net - wkhtmltopdf 多页 PDF 生成过程挂起

正则表达式作为 VB.NET 字典中的键

asp.net - Json.Net 如何将 null 反序列化为空字符串?