繁体   English   中英

函数返回一个const值

[英]function returning a const value

我有一个以下函数接受枚举值,并根据枚举值返回一个常量值(在不同的类中)。 现在我得到一个“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. 有没有其他选择来实现相同的目标?

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

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

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

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

它应该是这样的

public int Testfunction(TESTENUM TestEnum)
{
    ...

返回类型不能声明为常量

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

const关键字在那里无效:删除它。

最可能的工作代码:

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 /类)。 网上还有很多内容可供阅读。

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


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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM