为什么我不能长期得出?

时间:2009-11-23 12:40:49

标签: c# .net type-safety

我的函数返回一些long值 它包含两个较低和较高32位的值。

我认为处理回报价值的最佳方法 是从long获取我的自定义类型并提供 类型扩展器,如GetLowerValue(),GetHigherValue()。

问题是.NET不允许从长

派生

如果你编译

public class SubmitOrderResult : long
{
}

你得到:

cannot derive from sealed type 'long'

为什么设计如此以及如何克服它?

由于

6 个答案:

答案 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)