4

私は列挙値を受け入れ、列挙値に基づいて定数値(別のクラスにある)を返す次の関数を持っています。「Constantinitializermissing」エラーが発生します。

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. 同じことを達成するための他のオプションはありますか?

4

4 に答える 4

25

ここで起こっていることは、コンパイラがTestfunctionという名前のパブリック定数整数フィールドを宣言しようとしていると考えていることです= 123;。識別子の後に続くものがないことに非常に驚いています。イニシャライザを期待していたことを示しています。

C#コンパイラには、CおよびC++ユーザーが一般的なC/C++構文を誤って使用することを開発チームが予想した場所がいくつかあります。たとえば、int x[];あなたがおそらく意味していることを指摘する特別なエラーメッセージがありますint[] x;。これは、一般的な間違いを検出し、それを修正する方法を説明する特別な目的のエラーメッセージからコンパイラが恩恵を受けることができる別の場所の例です。それが良いものだと思うなら、あなたはその機能を要求することを検討するかもしれません。

より一般的には、C#の「const」はCまたはC++の意味とは異なる意味を持ちます。C#には、状態を変更しない「const関数」、または潜在的に変更可能なデータの読み取り専用ビューを提供する「const参照」の概念がありません。C#では、「const」は、フィールド(またはローカル)がコンパイル時定数として扱われることを宣言するためにのみ使用されます。(「読み取り専用」は、フィールドがコンストラクターでのみ書き込まれることを宣言するために使用されます。これも非常に便利です。)

于 2013-01-07T06:25:03.840 に答える
5

関数の戻り型から「const」キーワードを削除すると、問題が解決するはずです

こんな感じになります

public int Testfunction(TESTENUM TestEnum)
{
    ...

戻り型を定数として宣言することはできません

于 2013-01-07T06:06:29.090 に答える
2

.NETメソッドはconstどのタイプも返すことができません。

constキーワードはそこで無効です:それを削除してください。

于 2013-01-07T06:06:20.397 に答える
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# リファレンス)によると:

constキーワードは、フィールドまたはローカル変数の宣言を変更するために使用されます。フィールドまたはローカル変数の値が定数であることを指定します。これは、変更できないことを意味します。

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/structs など) と参照型( string/classes など)しかありません。ウェブ上で読むべきものは他にもたくさんあります。

したがってint、C# の値型と同様に、それを返すとコピーされます。したがって、「定数」を返している場合でもint、戻り値は定数ではなく、戻り値を変更しても「定数が変更されて SegFault が発生する」ことはありません。


さて、質問に答えるのを忘れていました...

  1. 関数の戻り値の型はどのくらい正確ですか? (私はオブジェクトの戻り値の型を使用していますが、これはエラーをスローしません)

    上記のコードで示したように、int. 変更してはならないタイプ
    const int blah = 1の変数/フィールドのみを宣言します(実行することにより)。C#では型ではありませんblahintblah = 2const int

  2. 同じことを達成するための他のオプションはありますか?

    うーん、これは特に答える必要はないと思いますが…

于 2013-01-07T06:45:39.257 に答える