我使用 MiscUtil Operators 一段时间没有任何大问题。但现在我发现了一些真正困扰我的事情:
byte first = 13;
byte second = 29;
byte result = MiscUtil.Operator.Add(first, second);
这个方程的简单预期结果应该是
result == 42
但不幸的是这会抛出一个 InvalidOperationException
:The binary operator Add is not defined for the types 'System.Byte' and 'System.Byte'.
通过仔细观察这种奇怪的行为,您会发现
System.Byte
确实没有实现这些运算符。在 C# 中,这些类型将被隐式转换为 Int32
并实现这些运算符。所以现在的问题是:有没有机会让 MiscUtil 与
byte
和 sbyte
一起工作? 最佳答案
从技术上讲,int
等也没有实现这些操作符。它们不是由正常意义上的“运算符”提供(这将涉及静态 call
),而是由 add
操作码直接表示。最终,这种情况下的失败实际上来自 Expression
API:
var x = Expression.Parameter(typeof(byte));
var y = Expression.Parameter(typeof(byte));
var func = Expression.Lambda<Func<byte,byte,byte>>(
Expression.Add(x,y), x, y).Compile(); // explodes here
要修复它,MiscUtil 必须对
byte
/sbyte
版本进行特殊处理;就像是:var x = Expression.Parameter(typeof(byte));
var y = Expression.Parameter(typeof(byte));
var func = Expression.Lambda<Func<byte,byte,byte>>(
Expression.Convert(
Expression.Add(
Expression.Convert(x, typeof(int)),
Expression.Convert(y, typeof(int))
),typeof(byte)), x, y).Compile();
然而!我已经很久没有知道 Jon 的 repo 的 key 了;p
奇怪的是,虽然,在原始 IL 中实现整个事情并不是那么困难......我实际上偶然发现(在 USB 驱动器上)一个非常旧的 .NET 2.0(即在
Expression
之前)版本的“通用运算符“我多年前写的,这可能会完成这项工作。或者更简单:只需在本地修补 MiscUtil 即可处理 byte
/sbyte
。关于c# - 如何在 System.Byte 上使用 MiscUtil.Operator?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14359087/