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
}