在不编写包装器的情况下禁用 C# 中第三方 类 的隐式转换?

Disable implicit conversion of third party classes in C# without writing wrappers?

我使用的引擎有 Vector3Vector2 类.

然而,不小心将 一个 Vector2 传递给需要一个 Vector3[=32] 的 方法会出现一些常规问题=].

目前它自动转换 为 (x, y, 0) 的 Vector3。在遇到运行时问题后,我总是需要一些时间才能找到这些微不足道的原因...

是否有可能以某种方式阻止这两个第三方类之间的隐式转换,以便我可以在编译时检测到这些问题?

目前我唯一的想法是编写包装器并用它们替换 Vector3 和 Vector2 的所有用法。

但是看起来很乏味。 还有其他方法吗?

我想 Vector3 class 有这个代码:

public static implicit operator Vector3(Vector2 vector) => new Vector3(vector.x, vector.y, 0);

遗憾的是,您无法阻止转换(C# built-in 功能)。老实说,这是引擎设计师的一个糟糕的设计选择...

您只能创建自己的包装器来解决这个问题。

public class Vector2Ex {
  public Vector2 vector2 { get; set; }
}

您可以创建自定义代码分析器并将其配置为在代码中发生这种隐式转换时引发 compile-time 错误。

有关教程,请参阅 https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/tutorials/how-to-write-csharp-analyzer-code-fix

如果您这样做,您还可以将该分析器放入 Nuget 包中,以便使用相同 third-party 库的其他人可以从您所做的工作中受益。