我希望能够制作如下代码:
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);
答案 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};
只列出三个整数列表。