C# 向现有类型添加隐式转换

标签 c# implicit-conversion

在 C# 中有没有办法将隐式转换添加到已在其他程序集中定义的类型?

例如,如果我使用两个不同的程序集,每个程序集都提供自己的 Vector3 struct,并在它们的 API 中使用它,那么最好能够定义一次转换,然后再定义一次转换只需将 Foo.Vector3 传递给需要 Bar.Vector3 的方法,并让它自动转换。

如果我有这些库的源代码,那么我可以添加隐式转换运算符。没有那个来源,我目前每次都使用辅助函数明确地自己进行转换。我希望有更好的方法。

我意识到我可以创建自己的 Vector3 struct,并使用与其他两个结构之间的隐式转换运算符,但这并不能解决我想直接 将一种(外部定义的)类型的对象传递给期望另一种类型的方法。

奖励问题:在其 API 中公开诸如 Vector3 结构之类的库的作者是否应该做些什么来促进这方面的易用性?

最佳答案

您可以为您自己编写的任何类型提供与第三方类型之间的隐式转换,但不能添加对两种第三方类型之间的隐式转换的支持。

您可以通过向两种 Vector3 类型添加扩展方法来提高两种类型之间转换的优雅度;

public static Bar.Vector3 ToBarVector3(this Foo.Vector3 foo) {
    return /* instance of Bar.Vector3 */
}

public static Foo.Vector3 ToFooVector3(this Bar.Vector3 bar) {
    return /* instance of Foo.Vector3 */
}

这大约是您可以期望达到的最佳效果。

关于C# 向现有类型添加隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754815/

相关文章:

c# - Azure Key Vault .NET - 找不到方法

c++ - 为什么隐式转换在累积中不起作用?

java - double 到 int 类型转换是否会被视为隐式类型转换?

c++ - 对重载运算符参数进行隐式转换时出现编译器错误

c - 与负数比较时,为什么 sizeof 运算符会发生这种情况?

c# - 将 IEnumerable<object> 转换为 List<object>

c# - 在表单显示之前运行的代码。 C#

c# - 如何修复我的 C# 快速排序算法中的隐式转换错误?

c# - FlowLayoutPanel中的点击事件

c# - 如何使用数据绑定(bind)为这种显示创建用户控件?