函数返回一个const值

时间:2013-01-07 06:04:17

标签: c# .net visual-studio-2010 enums .net-4.5

我有一个接受枚举值的跟随函数,并且基于枚举值返回一个常量值(在不同的类中)。现在我得到一个“Constant initializer missing”错误。

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 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:5)

从函数返回类型中删除“const”关键字应解决问题

应该是这样的

public int Testfunction(TESTENUM TestEnum)
{
    ...

返回类型不能声明为常量

答案 2 :(得分:2)

.NET方法无法返回const任何类型..

const关键字无效:删除它。

答案 3 :(得分: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 / TestEnum / structs)和引用类型(如{{1} } /类)。网上还有很多内容可供阅读。

因为string是C#中的值类型,当您返回时,它会被复制。因此,即使您返回“常量int”,返回值也不是常量并且修改返回值将“更改常量并导致段错误”。


好吧,我忘了回答你的问题......

  1. 函数的返回类型究竟如何? (我正在使用对象返回类型,这不会抛出任何错误)

    就像我在上面的代码中展示的那样,int int仅声明const int blah = 1类型的变量/字段blah,其中一个不得修改它(通过执行int)。在C#中,blah = 2 不是类型。

  2. 还有其他选择可以实现吗?

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