2016-05-30 34 views
5

搜索努力:如何创建用于描述c#中的对象的自定义语法?

  1. 谷歌:
  2. #1:

而且一些我不记得了......


孕前:每一个 “内置式” 在C#中(如intfloatchar等)是一个类,并且C#中的每个类都继承自Object类。因此,每个“内置类型”都继承Object类。例如,我想要设置一个double变量,我需要使用“正常”语法设置一些属性。这里是我的意思是:

double number = new double(); 

number.leftSide= 5; 
number.rightSide = 23; 

Console.Write(number); 

// Output: 
// 5.23 

但是C#有创建double变量(在一种方式,它会做什么,我试图上面做,不就是上面的代码会实际上是一个特殊的,相当于语法工作):

double number = 5.23; 

编译器理解的浮点数字分成两个:5和23

我的问题是,如果我可以做T他和我自己的班级一样。举例来说,如果我有我自己的Time类(这只是一个例子,所以请不要建议使用内置的脱产班),我希望有实例它像这样的选项:

Time time = 10:25; 

编译器会理解冒号将数字分成几小时和几分钟(这是我假设需要在Time类中创建的属性)。

我听说过Roslyn CTP,但我正在寻找一种更简单的内置方式来完成我所描述的操作。

我可以做到吗?

+1

一般的规则是少数几种语言(Groovy中)是运营商强迫,你的片段可以呈现(整数10)(操作员:)(整数25) - 但我认为':'是不可能的C# –

+1

cont。5.23在词法层面上,低于解析器一个层次。 –

回答

8

目前在C#中这是不可能的。您可以做的最接近的是定义从stringDate的隐式转换。例如

public class Time 
{ 
    public static implicit operator Time(string value) 
    { 
     // Initialize your object with value 
     // Similar to 
     var values = value.Split(':'); 
     var hour = Convert.ToInt32(values[0]); 
     var min = Convert.ToInt32(values[1]); 
     . . . 
    } 
    . . . // Your fields, properties and methods 
} 

这将让你

Time time = "10:25"; 
+0

这是一个美妙的解决方案!我会等待其他答案,看看他们是否更有帮助,但如果没有 - 我会选择这一个。 – Sipo

+2

@Sipo这个答案提供了一个非常好的方式来表达你想要最终实现的。我认为包括我在内的其他答案可以提供更多的背景信息。就我个人而言,我只是考虑将'Time'作为'struct',而不是'class'。 –

+0

@OndrejTucny - 非常感谢你!如果我将'Time'创建为'struct',我能做我想做的事情吗?或者我仍然需要@ Shreevardhan的解决方案? – Sipo

3

我的问题是,如果我可以做我自己的类相同。

不,你不能。 C#不支持用户定义的语法结构。你必须接受一组语言特征,例如语法结构,操作符等。由语言定义。

c#中的每个“内置类型”(如int,float,charetc。)都是一个类,C#中的每个类都继承自Object类。

原语类型(如intfloat等)类。它们是原始类型。为了支持诸如方法之类的面向对象的特征,语言定义了“种类”阴影原语类型的struct(例如Int32,Single)。

事实上,一切都可以是Object是通过装箱实现的原始类型 - 一种采用原始值类型并在其周围创建对象'信封'的进程。

相关问题