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. 有没有其他选择可以实现相同的目标?

4

4 回答 4

25

这里发生的是编译器认为您正在尝试声明一个名为 Testfunction 的公共常量整数字段,并且非常惊讶地发现没有= 123;跟随标识符。它告诉你它期望初始化器。

在 C# 编译器中的许多地方,开发团队预计 C 和 C++ 用户会错误地使用常见的 C/C++ 语法。例如,有一条特殊的错误消息int x[];指出您可能指的是int[] x;. 这是编译器可以从检测常见错误并描述如何修复它的专用错误消息中受益的另一个示例。如果您认为这是一个很好的功能,您可能会考虑请求该功能。

更一般地说,C# 中的“const”的含义与 C 或 C++ 中的含义不同。C# 没有不改变状态的“const 函数”的概念,也没有提供潜在可变数据的只读视图的“const 引用”的概念。在 C# 中,“const”仅用于声明字段(或本地)将被视为编译时常量。(而“readonly”用于声明一个字段只写在构造函数中,这也很有用。)

于 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# Reference)

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/ TestEnumstructs)和引用类型(如string/classes)。网上还有很多要读的。

就像intC# 中的值类型一样,当您返回它时,它会被复制。因此,即使您返回“常量int”,返回的值也不是常量,修改返回值也不会“更改常量并导致 SegFault”。


嗯,忘记回答你的问题了……

  1. 函数的返回类型究竟是怎样的?(我正在使用对象返回类型,这不会引发任何错误)

    就像我在上面的代码中显示的那样,int.
    const int blah = 1只声明一个blah类型的变量/字段,int不能修改它(通过做blah = 2)。在 C#const int不是类型。

  2. 有没有其他选择可以实现相同的目标?

    嗯...我想我实际上不需要回答这个...

于 2013-01-07T06:45:39.257 回答