我的函数返回一些long值 它包含两个较低和较高32位的值。
我认为处理回报价值的最佳方法 是从long获取我的自定义类型并提供 类型扩展器,如GetLowerValue(),GetHigherValue()。
问题是.NET不允许从长
派生如果你编译
public class SubmitOrderResult : long
{
}
你得到:
cannot derive from sealed type 'long'
为什么设计如此以及如何克服它?
由于
答案 0 :(得分:11)
如前所述,.NET中的值类型是密封的,因此无法从long派生。您应该按照建议创建扩展方法。
示例
public static class LongExtensions
{
public static long GetLowerValue(this long value)
{
...
}
public static long GetHigherValue(this long value)
{
...
}
}
答案 1 :(得分:6)
您不能从任何.NET值类型派生 - 它们都是按定义密封的。
也许您可以将GetLowerValue和GetHigherValue方法实现为扩展方法?
答案 2 :(得分:5)
我的函数返回一个long值,它包含两个较低和较高32位的值。
这听起来像是一个非常非常糟糕的黑客。它可能适用于接近金属的语言(例如C),但不适用于更高级别的面向对象语言。
在OO语言中,您可以扩展类型系统,而不是骚扰现有类型来进行出价。因此,解决方案应该是创建一个包含您信息的新类型。
答案 3 :(得分:4)
您可以做的是使用隐式转换运算符编写结构。这将完全按照你想要的方式工作:
public struct SubmitOrderResult
{
private long _result;
public SubmitOrderResult(long result)
{
_result = result;
}
public long Result
{
get { return _result; }
set { _result = value; }
}
public int GetHigherValue()
{
return (int)(_result >> 32);
}
public int GetLowerValue()
{
return (int)_result;
}
public static implicit operator SubmitOrderResult(long result)
{
return new SubmitOrderResult(result);
}
public static implicit operator long(SubmitOrderResult result)
{
return result._result;
}
}
然后你可以这样做:
SubmitOrderResult result = someObject.TheMethod();
Console.WriteLine(result.GetHigherValue());
Console.WriteLine(result.GetLowerValue());
......就像你想要的那样。
答案 4 :(得分:3)
如果我理解正确,你的函数实际上会返回两个值,而你将它们打包成long
的事实是一个实现细节。在这种情况下,隐藏此详细信息并创建一个包含值和所需操作的类:
public class SubmitOrderResult
{
private readonly long value_;
public int OneValue
{
get { return (int)(value_ >> 32); }
}
public int TheOtherValue
{
get { return (int)(value_ & 0xFFFFFFFF); }
}
public SubmitOrderResult(long value)
{ value_ = value; }
}
答案 5 :(得分:1)
你无法克服它。
由于long
是密封类型,因此您无法从它们继承。请参阅MSDN
因为结构是隐式密封的,所以它们不能被继承。
有关详细信息,请参阅Inheritance (C# Programming Guide)。