C# 返回常量值的函数

C# 返回常量值的函数,c#,.net,visual-studio-2010,enums,.net-4.5,C#,.net,Visual Studio 2010,Enums,.net 4.5,我有一个下面的函数,它接受一个枚举值,并基于该枚举值返回一个常量值(位于不同的类中)。现在我得到一个“常量初始值设定项丢失”错误 函数的返回类型到底是什么?(我使用的是对象返回类型,这不会引发任何错误) 有没有其他方法可以达到同样的效果 .NET方法不能返回const任何类型 const关键字在此处无效:将其删除。从函数返回类型中删除“const”关键字应该可以解决问题 应该是这样的 public int Testfunction(TESTENUM TestEnum) { ... 返回

我有一个下面的函数,它接受一个枚举值,并基于该枚举值返回一个常量值(位于不同的类中)。现在我得到一个“常量初始值设定项丢失”错误

  • 函数的返回类型到底是什么?(我使用的是对象返回类型,这不会引发任何错误)

  • 有没有其他方法可以达到同样的效果


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

    const
    关键字在此处无效:将其删除。

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

    应该是这样的

    public int Testfunction(TESTENUM TestEnum)
    {
        ...
    

    返回类型不能声明为常量

    这里发生的事情是编译器认为您试图声明一个名为Testfunction的公共常量整型字段,并且非常惊讶地发现没有
    =123在标识符后面。它告诉你它期望初始值设定项

    <> P>编译器中有很多地方,开发团队预期C和C++用户会错误地使用一个通用的C/C++语法。例如,
    intx[]有一条特殊的错误消息指出您可能指的是
    int[]x。这是另一个例子,编译器可以从一个特殊用途的错误消息中获益,该消息检测常见错误并描述如何修复它。如果你认为这个特性是好的,你可能会考虑请求它。


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

    最可能的工作代码:

    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
    仅用作字段(如
    TestClass.constValue1
    )或局部变量的修饰符,不适用于函数返回类型


    因此,您来自伟大的C/C++王国。考虑到我对C/C++的知识非常有限,C/C++中的
    const
    返回类型仅对指针有意义

    <代码> /C++代码 常数int m=1; //它返回指向只读内存的指针 常数int*a(){ 退货与维修; }

    但是,除非您使用的是不安全的代码,在C#中没有指针。只有值类型(如
    int
    /
    DateTime
    /
    TestEnum
    /structs)和引用类型(如
    string
    /classes)。网络上还有很多值得阅读的内容

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


    我忘了回答你的问题了

  • 函数的返回类型到底是什么?(我使用的是对象返回类型,这不会引发任何错误)

    就像我在上面代码中显示的一样,
    int

    const int blah=1
    仅声明类型为
    int
    的变量/字段
    blah
    ,不能对其进行修改(通过执行
    blah=2
    )。在C#
    中,const int
    不是一种类型

  • 有没有其他方法可以达到同样的效果

    嗯。。。我想我其实不需要回答这个问题


  • 你来自C/C++世界,对吗?C#中没有类似于
    const char[]
    的内容。而且,您的代码根本不正确,因为
    case
    应该位于
    开关
    块中。您的“Enum”似乎也不正确。您的代码仍然很奇怪,因为函数参数的
    Enum
    类型在。。。大写字母?“返回类型不能声明为常量”:这是C#中的一条规则吗?我根据microsoft为“const”关键字给出的定义推断出它是一条规则,即“const关键字用于修改字段或局部变量的声明”。因此,我们既不将其用于字段,也不将其用于局部变量。其次,const意味着在编译时应该知道的东西。但函数的返回值将在运行时决定,谢谢Eric的详细解释!是的,阿尔文。。。正如您所说,我们刚刚将返回类型更改为Int“[…]const,C/C++中的返回类型仅对指针有意义…”-const作为返回类型修饰符非常重要,因为它使返回值不可变(除非将const丢弃…是的..这是可能的。:/)。但是说它是绝对合法的,例如:const vector::iterator begin()const{…};for(const Type&v:vector.begin()){…}
    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
    }