搜索工作量:
- 谷歌:
- 自定义c#语法
- c#浮点
- 堆栈溢出:
- 自定义c#语法
- c#浮点
还有一些我不记得了。。。
前提:c#中的每一个"内置类型"(如int
、float
、char
等)都是一个类,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#中目前是不可能的。最接近的方法是定义从string
到Date
的隐式转换。例如
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类。
基元类型(如int
、float
等)是而不是类。它们是原始类型。为了支持面向对象的特性(如方法),该语言定义了"有点"遮蔽基元类型的struct
s(如Int32
、Single
)。
事实上,一切都可以是Object
,这是在通过装箱实现基元类型的情况下实现的——装箱是一个接受基元值类型并在其周围创建对象"信封"的过程