none
C#2015程式碼轉到2005問題 RRS feed

  • 問題

  • 各位先進好!由於我的廠商提供的API範例程式為2005版本,

    所以小弟目前在開發程式的時候只能使用2005版本,

    現在我遇到一個問題為我寫些範例程式為2015版本,

    我將2015版本的範例程式複製到2005版本使用時會出現一些錯誤,

    EX1.

    Public Class Valueset

    {  Public string 項目 {get; set;}

        

        Public string 標準值 {get; set;}

    }

    這段程式會在get與set下面出現~~符號,

    錯誤顯示:Syntec Remotec Client.Example Form.Value Set.項目.set'

                 不是標記成abstract or extern,因此必須宣告主体

    EX2. 

           var List_ValueSets=(List<Value Set>);

    這行程式在2015版本 var為藍色是有這個類型宣告的,

    但是在2005版本var為黑色並沒有此類型的宣告,

    小弟想請教各位先進我上面提到的這兩個問題要如何修改比較好呢?

    再麻煩各位先進了,感謝!

    2020年3月13日 上午 05:47

解答

  • this先進 您好!小弟有按照您的方法修改過了,目前有幾個問題想再請教一下,

    EX1按照您的寫法是可以執行的,EX2他會出現New運算式需要()或[]結尾,

    以下是我2015的程式碼:

    public List<ValueSet> List_ValueSets = new List<ValueSet>();

    //建立List_ValueSets表單給工程規格設定

      public class ValueSet
            {
                public string 項目 { get; set; } //項目
                public double 標準值 { get; set; } //標準值
                public double 上限值 { get; set; } //上限值
                public double 下限值 { get; set; } //下限值
                public double 補償值 { get; set; } //補償值
                public string 下料區 { get; set; } //下料區
                public string 項目啟用 { get; set; } //項目啟用

     private void Ini_SpecSetting(object sender, EventArgs e)
            {
                List_ValueSets.Add(new ValueSet { 項目 = "1.外徑", 標準值 = 0.0000,

               上限值 = 0.0000, 下限值 = 0.0000, 補償值 = 0.0000, 下料區 = "重磨",

               項目啟用 = "開啟" }); //建立第1列外徑項目的各項數值
                List_ValueSets.Add(new ValueSet { 項目 = "2.邊刀直徑", 標準值 = 0.0000,

               上限值 = 0.0000, 下限值 = 0.0000, 補償值 = 0.0000, 下料區 = "重磨",

               項目啟用 = "開啟" }); //建立第2列邊刀外徑項目的各項數值
                
            }

    ====================================================

    想要請教this 先進2015與2005在List語法上是否也有不同呢?

    再請this先進指導一下,感謝!

    這不是 List<T> 的問題,而是你用了  new ValueSet {項目 = ......} 這個方式稱為物件初始設定式,一樣是 C# 3.0 才有
    在 C# 2.0 你只能
    ValueSet obj = new ValueSet();
    obj.項目 = ...
    obj.標準值 =...
    ...
    然後
    List_ValueSets.Add(obj);

    參考
    物件和集合初始設定式 (C# 程式設計手冊)

    歷史的部分,參考:
    C# 的歷史


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 seanhua 2020年3月30日 上午 08:13
    2020年3月17日 上午 10:15
    版主

所有回覆

  • 1) 可以這樣改:

    string 存放標準值的變數;
    
    Public string 標準值 
    {
        get
        {
            return  存放標準值的變數;
        }
        set 
        {
            存放標準值的變數=value;
        }
    }

    2) 可以這樣改:

    List<ValueSet> List_ValueSets = new List<ValueSet>{ };

    2020年3月13日 上午 07:16
  • 每個新版都會有自己的新功能。你把新功能放到舊版去,當然會有問題。像 `var` 就是其中一個。
    你或許不用去使用舊版開發工具,找出廠商API用的 C# 版本,然後在 VS 指定相容版本來建置應該就行了。

    https://gunnarpeipman.com/select-csharp-version/


    理直氣和,切記。

    個人

    2020年3月13日 上午 07:25
  • 因為 2005  版頂多只到 C# 2.0 ,所以很多語法糖都不存在

    例如:

    (1) var 變數宣告 => C# 3.0 新增, 這個是依賴編譯器推斷正確型別,如果是 var i =1;  編譯器在編譯時將推斷為 int 而轉譯成 int i =1;
    所以在編譯器不支援的狀況下,就必須明確宣告變數的型別。

    (2) 自動實作屬性 =>  C# 3.0 新增,這也是讓編譯器自動補上相對應的程式碼與欄位。例如:

        class Student
        {
            public string Name { get; set; }
        }

    簡略的來說,編譯器會補完整個過程,變成類似以下的程式碼 (當然還有其他,例如 getter 和 setter 實際上各會產生一個 method)

    class Student
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

    順帶一提 : 屬性不是欄位 (property is not field)。屬性只是用於存取欄位的途徑,欄位才是真實儲存資料的地方。



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/



    2020年3月13日 上午 07:27
    版主
  • API 可能會有位元版本問題,請先確認。

    例如 2005 的通常是 32 bits ,2015 就要指定 CPU 為 x86 。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2020年3月13日 下午 03:46
  • this先進 您好!小弟有按照您的方法修改過了,目前有幾個問題想再請教一下,

    EX1按照您的寫法是可以執行的,EX2他會出現New運算式需要()或[]結尾,

    以下是我2015的程式碼:

    public List<ValueSet> List_ValueSets = new List<ValueSet>();

    //建立List_ValueSets表單給工程規格設定

      public class ValueSet
            {
                public string 項目 { get; set; } //項目
                public double 標準值 { get; set; } //標準值
                public double 上限值 { get; set; } //上限值
                public double 下限值 { get; set; } //下限值
                public double 補償值 { get; set; } //補償值
                public string 下料區 { get; set; } //下料區
                public string 項目啟用 { get; set; } //項目啟用

     private void Ini_SpecSetting(object sender, EventArgs e)
            {
                List_ValueSets.Add(new ValueSet { 項目 = "1.外徑", 標準值 = 0.0000,

               上限值 = 0.0000, 下限值 = 0.0000, 補償值 = 0.0000, 下料區 = "重磨",

               項目啟用 = "開啟" }); //建立第1列外徑項目的各項數值
                List_ValueSets.Add(new ValueSet { 項目 = "2.邊刀直徑", 標準值 = 0.0000,

               上限值 = 0.0000, 下限值 = 0.0000, 補償值 = 0.0000, 下料區 = "重磨",

               項目啟用 = "開啟" }); //建立第2列邊刀外徑項目的各項數值
                
            }

    ====================================================

    想要請教this 先進2015與2005在List語法上是否也有不同呢?

    再請this先進指導一下,感謝!

    2020年3月17日 上午 09:03
  • 感謝KKBruce先進的指導,我再來測試看看!
    2020年3月17日 上午 09:05
  • 感謝Bill Chung先進的回覆與指導,現在這個問題造成我滿大的困擾的,

    有一些語法我必須要重新再確認改寫,而且很多語法我也不知道要如何下手才好,

    不知道這種版本語法差異有甚麼資料可以查詢嗎?

    2020年3月17日 上午 09:08
  • 感謝 新冷熱情熄先進的指導,我有測試過了,我改位元版本後,結果還是一樣,

    我再測試看看其他方法,感謝! 

    2020年3月17日 上午 09:10
  • this先進 您好!小弟有按照您的方法修改過了,目前有幾個問題想再請教一下,

    EX1按照您的寫法是可以執行的,EX2他會出現New運算式需要()或[]結尾,

    以下是我2015的程式碼:

    public List<ValueSet> List_ValueSets = new List<ValueSet>();

    //建立List_ValueSets表單給工程規格設定

      public class ValueSet
            {
                public string 項目 { get; set; } //項目
                public double 標準值 { get; set; } //標準值
                public double 上限值 { get; set; } //上限值
                public double 下限值 { get; set; } //下限值
                public double 補償值 { get; set; } //補償值
                public string 下料區 { get; set; } //下料區
                public string 項目啟用 { get; set; } //項目啟用

     private void Ini_SpecSetting(object sender, EventArgs e)
            {
                List_ValueSets.Add(new ValueSet { 項目 = "1.外徑", 標準值 = 0.0000,

               上限值 = 0.0000, 下限值 = 0.0000, 補償值 = 0.0000, 下料區 = "重磨",

               項目啟用 = "開啟" }); //建立第1列外徑項目的各項數值
                List_ValueSets.Add(new ValueSet { 項目 = "2.邊刀直徑", 標準值 = 0.0000,

               上限值 = 0.0000, 下限值 = 0.0000, 補償值 = 0.0000, 下料區 = "重磨",

               項目啟用 = "開啟" }); //建立第2列邊刀外徑項目的各項數值
                
            }

    ====================================================

    想要請教this 先進2015與2005在List語法上是否也有不同呢?

    再請this先進指導一下,感謝!

    這不是 List<T> 的問題,而是你用了  new ValueSet {項目 = ......} 這個方式稱為物件初始設定式,一樣是 C# 3.0 才有
    在 C# 2.0 你只能
    ValueSet obj = new ValueSet();
    obj.項目 = ...
    obj.標準值 =...
    ...
    然後
    List_ValueSets.Add(obj);

    參考
    物件和集合初始設定式 (C# 程式設計手冊)

    歷史的部分,參考:
    C# 的歷史


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 seanhua 2020年3月30日 上午 08:13
    2020年3月17日 上午 10:15
    版主
  • 我剛剛想到一件事情,即使廠商給的是使用 Visual Studio 2005 開發的 dll,你一樣可以用 Visual Studio 2015 開發你的程式,只要把目標 Framework 設定為 .NET Framework 2.0 即可 (在專案屬性中設定) ,除非你有用到甚麼特定版本 .NET Framework 的功能。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年3月17日 上午 10:21
    版主
  • EX2我寫的太簡單了, 完整的寫法:

    List<ValueSet> List_ValueSets = new List<ValueSet>{ 第一個valueset, 第二個valueset, ...};

    List<ValueSet> List_ValueSets = new List<ValueSet>{ new ValueSet{項目="aa", 標準值="bb"}, new ValueSet { 內容省略}};

    2020年3月17日 下午 12:42
  • 哈哈,其實我說的就是這件事。:-)

    理直氣和,切記。

    個人

    2020年3月18日 上午 02:15
  • EX2我寫的太簡單了, 完整的寫法:

    List<ValueSet> List_ValueSets = new List<ValueSet>{ 第一個valueset, 第二個valueset, ...};

    List<ValueSet> List_ValueSets = new List<ValueSet>{ new ValueSet{項目="aa", 標準值="bb"}, new ValueSet { 內容省略}};

    這是集合初始設定式, 也是 C# 3.0 後新增功能

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年3月19日 上午 02:03
    版主
  • 各位先進 好!非常感謝你們熱情的指導,

    小弟目前照Bil Chung先進的方式去修改程式碼,

    是可以將設定的項目顯示在DataGridView上,

    但是捰憲宰有一個延伸的問題,就是我想要增加其他的項目遇到了,

    我會有兩筆項目的外徑項目的輸出,而不是一筆外徑項目與一筆邊刀直徑項目的輸出,

    以下是我寫的程式碼:

    Public Class Valueset

    { string Item;

      double Value;

      double Upper;

      double Lower;

      double Offset;

      string   Area;

      string  Choose; 

    }

    Public string 項目

    {

       get{return Item;}

       Set{Item="外徑";}

    }

    Public string 標準值

    {

       get{return Value;}

       Set{Value=0;}

    }

    .

    .

    .

    Public string 項目開啟

    {

       get{return Choose;}

       Set{Item="開啟"}

    }

    Private void Ini_SpeettincSg()

    {

       ValueSet obj =new ValueSet();

      obj.項目="外徑";

      obj.標準值=0"

      obj.上限值=0;

      obj.下限值=0;

      obj.補償值=0;

      obj.下料區="重磨";

      obj.項目開啟="開啟"

      List_ValueSet.Add(obj);

      obj.項目="邊刀直徑";

      obj.標準值=0"

      obj.上限值=0;

      obj.下限值=0;

      obj.補償值=0;

      obj.下料區="重磨";

      obj.項目開啟="開啟"

      List_ValueSet.Add(obj);

     dataGrridView_Temp.DataSource=List_ValueSets;

    }

    =====================================

    現在的所有數值很像無法由obj那裏寫入都是經由get與set那裏寫入,

    我有想要利用Public變數的方法來當作Set與obj中間的變數,

    但是他會出現無法使用巢狀程式外的變數的異常,想請問各位先進還有其他的方法嗎?

    2020年3月20日 上午 08:05
  • 我不太懂你的意思,是怎樣的語法導致"巢狀程式外的變數的異常" ?

    另外, 你上面貼的寫法,會改到同一個物件的屬性,也就是當 ValueSet 是個類別型別的時候,你兩次 Add 進去的 obj 都會指向同一個物件


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年3月20日 上午 09:55
    版主
  • Bil Chung先進您好!感謝的指導,

    小弟目前想要完成的功能就是可以輸出多筆資料在dataGridView上,

    例如:項目 標準值 上限值 下限值 偏移值 下料區 開啟項目

          外徑  0        0       0       0       0       0

          邊刀  0        0       0       0       0       0

    以下是我修改的程式碼:

    Public string ItemRe;

    Public double ValueRe;

    Public double UpperRe;

    Public double LowerRe;

    Public string AreaRe;

    Public string ChooseRe;

    Public Class Valueset

    { string Item;

      double Value;

      double Upper;

      double Lower;

      double Offset;

      string   Area;

      string  Choose; 

    }

    Public string 項目

    {

       get{return Item;}

       Set{Item=ItemRe;}

    }

    Public string 標準值

    {

       get{return Value;}

       Set{Value=ValueRe;}

    }

    .

    .

    .

    Public string 項目開啟

    {

       get{return Choose;}

       Set{Item=ChooseRe}

    }

    Private void Ini_SpeettincSg()

    {

       ValueSet obj =new ValueSet();

      obj.項目=ItemRe;

      obj.標準值=ValueRe;

      obj.上限值=UpperRe;

      obj.下限值=LowerRe;

      obj.補償值=OffsetRe;

      obj.下料區=AreaRe;

      obj.項目開啟=ChooeRe;

      List_ValueSet.Add(obj);

      List_ValueSet.Add(obj);

     dataGrridView_Temp.DataSource=List_ValueSets;

    }

    ======================================

    我的想法是想要利用Pulic變數來將數值傳入Set中,

    讓我可以去更改變數中的數值與字串,

    但是我這個寫法,它會出現"無法存取外部型別(程式名稱)的靜態型別

    (透過巢狀型別(程式).ValueSet)",

    想跟Bil Chung先進請教,我程式該如何修改會比較好呢?感謝!

    2020年3月24日 上午 08:22
  • 你的類別是巢狀的對吧,在巢狀型別無法直接存取上層容器型別的執行個體欄位是正常的事情,因為沒法確定當時上層型別是否已產生執行個體欄位。頂多你只能試試上層容器的欄位成為靜態的 (static 宣告)

    其實我還是不懂為啥要這麼複雜的設計,但我搞不清你的需求,所以也提不了甚麼具體建議。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2020年3月24日 下午 11:22
    版主
  • 感謝 Bil Chung 先進的解答,我再來測試看看!
    2020年3月30日 上午 08:13