如何在c#中创建描述对象的自定义语法



搜索工作量:

  1. 谷歌:
    • 自定义c#语法
    • c#浮点
  2. 堆栈溢出:
    • 自定义c#语法
    • c#浮点

还有一些我不记得了。。。


前提:c#中的每一个"内置类型"(如intfloatchar等)都是一个类,c#中的每个类都继承自Object类。因此,每个"内置类型"都继承自Object类。

考虑到这个先入为主的概念,我假设要设置double变量,例如,我需要使用"normal"语法设置一些属性。我的意思是:

double number = new double();
number.leftSide= 5;
number.rightSide = 23;
Console.Write(number);
// Output:
// 5.23

但是C#有一个特殊的、等价的语法来创建double变量(在某种程度上,它会做我尝试做的事情,而不是上面的代码实际上会起作用):

double number = 5.23;

编译器理解浮点将数字分为两部分:5和23。

我的问题是,我是否也能在自己的课上做到这一点。例如,如果我有自己的Time类(这只是一个例子,所以请不要建议使用内置的时间类),我希望可以选择这样实例化它:

Time time = 10:25;

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

我听说过Roslyn CTP,但我正在寻找一种更简单、内置的方式来做我所描述的事情。

我能做吗?

这在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";

我的问题是,我是否可以对自己的类执行同样的操作。

不,不能。C#不支持用户定义的语法构造。你必须适应语言定义的一组语言特征,如语法结构、运算符等。

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

基元类型(如intfloat等)是而不是类。它们是原始类型。为了支持面向对象的特性(如方法),该语言定义了"有点"遮蔽基元类型的structs(如Int32Single)。

事实上,一切都可以是Object,这是在通过装箱实现基元类型的情况下实现的——装箱是一个接受基元值类型并在其周围创建对象"信封"的过程

最新更新