2016-05-30 32 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是通過裝箱實現的原始類型 - 一種採用原始值類型並在其周圍創建對象'信封'的進程。

相關問題