我有一个接受枚举值的跟随函数,并且基于枚举值返回一个常量值(在不同的类中)。现在我得到一个“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;
}
}
函数的返回类型究竟如何? (我正在使用对象返回类型,这不会抛出任何错误)
还有其他选择吗?
答案 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
”,返回值也不是常量并且修改返回值将不“更改常量并导致段错误”。
好吧,我忘了回答你的问题......
函数的返回类型究竟如何? (我正在使用对象返回类型,这不会抛出任何错误)
就像我在上面的代码中展示的那样,int
int
仅声明const int blah = 1
类型的变量/字段blah
,其中一个不得修改它(通过执行int
)。在C#中,blah = 2
不是类型。
还有其他选择可以实现吗?
嗯......我想我实际上不需要回答这个......