我使用 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 与 bytesbyte 一起工作?

最佳答案

从技术上讲,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/

10-12 22:35