2013-01-07 57 views
4

我有一個接受枚舉值並基於枚舉值返回一個常量值(這是在不同的類)的以下函數。現在我得到一個「常量初始化程序丟失」錯誤。函數返回一個常量值

public const int Testfunction(TESTENUM TestEnum) 
{ 
    switch(TestEnum) 
    { 
     case TestEnum.testval1: 
     return testclass.constvalue; 
     case TestEnum.testVal2: 
     return testclass.constvalue1; 
     case TestEnum.testVal3: 
     return testclass.constvalue2; 
    } 
} 
  1. 函數的返回類型將究竟如何呢? (我正在使用對象返回類型,這不會引發任何錯誤)

  2. 是否有任何其他選項可以實現相同?

+3

你是從C/C++的世界裏,對不對?在C#中沒有像const char []這樣的東西。 –

+0

他他確切Alvin –

+0

此外,你的代碼根本不會是正確的,因爲'case'應該在'switch'塊內。你的「Enum」似乎也不正確。 –

回答

5

刪除「常量」從你的函數返回類型的關鍵字應該解決的問題

它應該是這樣的

public int Testfunction(TESTENUM TestEnum) 
{ 
    ... 

返回類型不能聲明常數

+0

「返回類型不能被聲明爲常量」:它是C#中的規則嗎? –

+1

我從微軟的「const」關鍵字定義中推斷出它是一個規則,即「const關鍵字用於修改一個字段或局部變量的聲明」。所以在這裏我們既不使用該字段也不使用局部變量。其次,const意味着在編譯時應該知道的東西。但函數的返回值將在運行時決定 –

2

.NET方法不能返回const任何類型..

const關鍵字是無效的有:將其刪除。

22

這裏發生的是編譯器認爲你試圖聲明一個名爲Testfunction的公共常量整數字段,並且非常驚訝地發現標識符後面沒有= 123;。它告訴你它期望初始化器。

C#編譯器中有許多地方,開發團隊預計C和C++用戶會錯誤地使用通用的C/C++語法。例如,int x[];有一個特殊的錯誤消息,指出您的意思可能是int[] x;。這是另一個地方的例子,編譯器可以從檢測到常見錯誤的特殊用途錯誤消息中受益,並描述如何修復它。如果你認爲這個功能很好,你可以考慮請求這個功能。

更一般地說,C#中的「const」意味着與C或C++中的不同。 C#沒有不改變狀態的「const函數」的概念,也沒有提供潛在可變數據的只讀視圖的「const引用」。在C#中,「const」僅用於聲明一個字段(或本地)被視爲編譯時常量。 (和「只讀」來聲明一個字段僅在構造函數中,這也是非常有用的寫入。)

+0

感謝Eric的詳細解釋! –

+1

@nowhewhomustnotbenamed:不客氣! –

+0

+1。很好的答案。 –

2

最有可能的工作代碼:

public static class TestClass 
{ 
    public const int constValue1 = 1; 
    public const int constValue2 = 2; 
    public const int constValue3 = 3; 
} 

enum TestEnum 
{ 
    testVal1, testVal2, testVal3 
} 

public int TestFunction(TestEnum testEnum) 
{ 
    switch (testEnum) 
    { 
     case TestEnum.testVal1: 
      return TestClass.constValue1; 
     case TestEnum.testVal2: 
      return TestClass.constValue2; 
     case TestEnum.testVal3: 
      return TestClass.constValue3; 
    } 
    return 0; // all code paths have to return a value 
} 

首先,根據const (C# Reference)

常量關鍵字被用於修改一個字段或局部變量的聲明。它指定字段或局部變量的值是常量,這意味着它不能被修改。

在C#,const僅作爲一個字段(如TestClass.constValue1)或局部變量,不適合於函數返回類型的改性劑。


所以你是來自偉大的C/C++王國。我非常有限的知識,C/C++的思考,在C/C const返回類型++只與指針有意義...

// C++ code 
const int m = 1; 

// It returns a pointer to a read-only memory 
const int* a(){ 
    return &m; 
} 

但是,除非你正在使用不安全的代碼,存在沒有指針C#。只有值類型(如int/DateTime/TestEnum /結構)和引用類型(如string /類)。在網上閱讀的內容還有很多。

所以如同int是C#中的一個值類型,當你返回它時,它會得到複製。因此,即使您要返回「常量int」,返回的值爲也不是常量,並且修改返回值將而不是「更改常數並導致SegFault」。


嗯,我忘了回答你的問題......

  1. 究竟如何,函數的返回類型會是什麼? (我正在使用對象返回類型,這不會引發任何錯誤)

    就像我在上面的代碼中顯示的那樣,int
    const int blah = 1只聲明int類型的變量/字段blah哪一個不能修改它(通過執行blah = 2)。在C#const int中是而不是的一種類型。

  2. 有沒有其他選項可以實現?

    嗯......我想我實際上並不需要回答這個...

+0

是的阿爾文...正如你所說的,只是將返回類型改爲Int –

+0

「[...]在C/C++中const返回類型只對指針有意義...」 - Const作爲返回類型修飾符非常重要,因爲它使得返回值是不可變的(除非一個人將const轉換掉),這是可能的。:/)。但是,這是絕對合法的,例如:const vector :: iterator begin()const {...}; for(const Type&v:vector.begin()){...} – MABVT