覆盖范围内基本/基本类型的处理

时间:2012-02-07 05:34:17

标签: c# nlp overrides

我希望能够制作如下代码:

30, 60, 90

让它在List<int>中包含这些数字。问题是,为了做到这一点,我相信我需要能够覆盖int在此范围内的工作方式。有没有什么方法可以让我自己的“Int”类可以在输入像30之类的基本常量时在特定范围内使用?如果我无法覆盖int,那么必须在此范围内明确使用该类,我将最终得到如下内容:

Int(30),Int(60),Int(90)

代码仍然少于标准方式:

var nums = new List<int>(); nums.Add(30); nums.Add(60); nums.Add(90);

甚至:

var nums = new List<int>{ 30, 60, 90 };

我正在玩我自己的脚本语言,仅用于教育目的,并非供其他人使用。我试图看看我能在多大程度上简化语法,以便更接近自然语言。这个问题顶部的第一个代码块是否可能?如果可以,我可以将它扩展到其他原始类型吗?

编辑:我想要一些纯粹的C#,我不是在做我自己的解析,也不是在编写自己的编译器。我很好奇,如果不知何故我可以通过我自己的类型处理像常量int这样的原始类型?我不认为这是可能的,但如果不是,至少StackOverflow擅长提供我可能没想过的替代方案。

好的,这就是我到目前为止所提出的让我更接近的原因:

public static class Values
{
    static public List<int> Make(params int[] vals)
    {
        return vals.ToList();
    }
}

这让我可以这样做:

var nums = Values.Make(30, 60, 90);

当然,这并不比var nums = new List<int>{ 30, 60, 90 };短得多,但是它让我抽象出来,所以他们也可以这样做:

var nums = Values.Make(30.0f, 60.0f, 90.0f);

只要为浮点列表创建一个处理程序。不幸的是,如果我制作一个通用的方法,就像这样:

public static List<T> Make<T>(params T[] vals) where T : IComparable<T>
{
    return vals.ToList();
}

然后它使用更长时间的语法:

var nums = Values.Make<float>(30.0f, 60.0f, 90.0f);

2 个答案:

答案 0 :(得分:3)

如果您使用的是C#4.0,则可以将其简化为:

var nums = new[] { 30, 60, 90 };

将创建int[]。这也可以与其他类型一起使用:

var floats = new[] { 30.0f, 60.0f, 90.0f };

如果你真的需要List<T>,那么你可以这样做:

var nums = new[] { 30, 60, 90 }.ToList();

答案 1 :(得分:2)

Smoak有最干净,最有效的方式来实现我所描述的特定情况,但是如果你想看看如何实际覆盖基本原始类型的处理,这里就是一个例子。

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        // This lets you add new functionality to the primitive type 'int'
        // Allowing you to do (10).Add(5) to give you a List<int> with {10, 5}
        public static List<int> And( this int num, int other )
        {
            return new List<int> { num, other };
        }

        public static List<int> And( this List<int> num, int other )
        {            
            num.Add(other);
            return num;
        }
    }
}

// ===========================================================================
// And Program.cs
using ExtensionMethods;

namespace SyntaxTests
{
    class Program
    {
        static void Main( string[] args )
        {            
            var nums = (30).And(60).And(90);

            nums.ForEach(n => Console.WriteLine(n + "\n"));
        }
    }
}

输出如下:

30

60

90

除了不如Smoak的答案优雅之外,效率也较低,这行代码var nums = (30).And(60).And(90);创建一个int,然后创建一个包含两个整数的列表,然后创建一个包含三个整数的列表,而var nums = new[] {30, 60, 90};只列出三个整数列表。