我有一个下面的函数,它接受一个枚举值,并根据枚举值返回一个常量值(它在不同的类中)。现在我得到一个"常量初始化器丢失"错误。
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;
}
}
函数的返回类型究竟是什么?(我使用对象返回类型,这不会抛出任何错误)
是否有其他方法可以达到相同的效果?
这里发生的事情是编译器认为您正在尝试声明一个名为Testfunction的公共常量整型字段,并且非常惊讶地发现标识符后面没有= 123;
。它告诉你它需要初始化式
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# 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)和引用类型(如string
/classes)。在网上有更多的东西可以读。
因此,由于int
是c#中的值类型,当您返回它时,它将复制。所以,即使你是返回一个"常数int
"的返回值是不是一个常数和修改返回值将不是"改变常数和导致SegFault"。
哦,我忘了回答你的问题了…
函数的返回类型究竟是什么?(我使用对象返回类型,这不会抛出任何错误)
就像我在上面的代码中展示的一样,
int
.const int blah = 1
只声明int
类型的变量/字段blah
,不能修改它(通过执行blah = 2
)。在c#const int
中不是类型是否有其他方法可以达到相同的效果?
嗯…