VB中重载的Not运算符无法在C#中以!运算符使用的解决方法
解决C#中无法使用
!运算符调用VB类Not重载的问题 问题原因
这是VB.NET和C#对运算符的映射规则差异导致的:
- VB的
Or运算符在.NET体系中被标记为按位/逻辑或,C#的|运算符正好对应这个映射关系,所以你能直接用|调用VB的Or重载,没有问题。 - 但VB的
Not运算符默认在.NET中被归类为按位取反,而C#的!是独立的逻辑非运算符。对于非布尔类型的自定义类(比如你的Filter<string>),C#编译器不会自动把VB的Not重载映射为!,只会将其识别为~(按位取反),这就是你收到编译错误的核心原因。
解决方案
根据你的需求,有两种实用的解决方式:
方案1:在C#中直接使用~运算符替代!
既然VB的Not在C#中对应的原生符号是~,直接替换即可满足需求:
Filter<string> myFilter = GetFilter(); Filter<string> negatedFilter = ~myFilter; // 等价于VB中的 Not myFilter
方案2:修改VB类,让C#识别!运算符
如果你一定要在C#中使用!符号,需要让VB类实现.NET的ILogicalNegationOperators接口,这个接口会明确标记逻辑非运算符的重载。具体步骤如下:
- 确保项目引用了
System.Numerics程序集(.NET Core 3.0+/NET 5+默认包含,.NET Framework需要手动添加引用)。 - 修改VB的
Filter类,实现ILogicalNegationOperators(Of Filter(Of T), Filter(Of T))接口:
Imports System.Numerics Public Class Filter(Of T) Implements ILogicalNegationOperators(Of Filter(Of T), Filter(Of T)) ' 保留原有的Not运算符重载 Public Shared Operator Not(ByVal operand As Filter(Of T)) As Filter(Of T) ' 你的原有实现逻辑 Return New Filter(Of T)() End Operator ' 显式实现接口,让C#识别为!运算符 Public Shared Operator LogicalNegation(ByVal operand As Filter(Of T)) As Filter(Of T) Implements ILogicalNegationOperators(Of Filter(Of T), Filter(Of T)).LogicalNegation ' 复用已有的Not实现,避免重复代码 Return Not operand End Operator End Class
修改完成后,你就能在C#中直接使用!运算符了:
Filter<string> negatedFilter = !myFilter;
兼容.NET Framework的折中方案
如果你的项目基于不支持ILogicalNegationOperators接口的.NET Framework,可以在VB类中添加一个静态方法,供C#显式调用:
Public Class Filter(Of T) ' 原有的Not运算符重载 Public Shared Operator Not(ByVal operand As Filter(Of T)) As Filter(Of T) ' 你的实现逻辑 Return New Filter(Of T)() End Operator ' 供C#调用的静态方法 Public Shared Function Negate(ByVal operand As Filter(Of T)) As Filter(Of T) Return Not operand End Function End Class
在C#中调用:
Filter<string> negatedFilter = Filter<string>.Negate(myFilter);
内容的提问来源于stack exchange,提问作者Georg Plaz
相关产品推荐
相关产品推荐

