对方法的参数的范围进行限制

sdfasf3e4awef 2011-08-24 07:04:42
如:

方法: private void NewMethod(int i) { }

对该方法的参数 i 进行限制,如 1 < i < 10,

调用该方法时,如为 NewMethod(12),编译时报错。

有没有好的方法得到这个功能?

我尝试过用 C#中的 特性,但是没有成功。

如[Obsolete("",true)],编译时报错,要的就是这个效果。

希望大家多多帮助,谢了。

...全文
914 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wakeupp 2011-08-25
  • 打赏
  • 举报
回复
啥...有能让编译报错的方法
Icedmilk 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sshoub 的回复:]
因为调用方法的工程可能是WinForm也可能是Console,
要的效果:写代码时就明确发现错误,
所以我觉得还是 Debug.Assert() 比较好点。
虽然是运行过程中提示……
[/Quote]
Debug.Assert也无法在写代码的时候告诉你错误

编译器就像生产汽车的流水线
你现在的要求就好比告诉流水线:
“哎,那个什么,你给我造一辆只能在北京开的车”

编译器会很郁闷:“靠,我哪知道我造的车会在哪里开”
sdfasf3e4awef 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zyloveyrf 的回复:]
LZ 你自己写的方法编译时怎么报错?
运行时吧
自己写的方法编译时只会出现语法错误
运行时,就可以处理你说的情况
编译时弹出提示不是很好实现,找到一种提示的办法,请大家给点意见:

C# code
private void NewMethod(int i)
{
if(i>10)
{
console.writeline("操作提示信息");

}
[/Quote]

谢谢你的回复,
因为调用方法的工程可能是WinForm也可能是Console,
要的效果:写代码时就明确发现错误,
所以我觉得还是 Debug.Assert() 比较好点。
虽然是运行过程中提示……
ttiimm11 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sshoub 的回复:]

引用 11 楼 ttiimm11 的回复:
LZ的是要重新制定一种数据类型吗?

重新制定一种数据类型,怎么写,能举个例子吗?
[/Quote]
我也想知道如何定义一种数据类型
你说的Debug.Assert(((0< i) && (i < 10)), "i的范围为(1-10)", "调用方法NewMethod时出错");这个方法,也不会在编译时报错吧?编译应该能通过的。
连风 2011-08-25
  • 打赏
  • 举报
回复
如果传入参数是const的话,那么编译期间说不能能报错,因为const是编译时能确定的值。
如果是变量的话,估计没有办法在编译时报错吧,因为编译时都不能确定值。
萧炎 2011-08-25
  • 打赏
  • 举报
回复
LZ 你自己写的方法编译时怎么报错?
运行时吧
自己写的方法编译时只会出现语法错误
运行时,就可以处理你说的情况
编译时弹出提示不是很好实现,找到一种提示的办法,请大家给点意见:

C# code
private void NewMethod(int i)
{
if(i>10)
{
console.writeline("操作提示信息");

}
sdfasf3e4awef 2011-08-25
  • 打赏
  • 举报
回复
编译时弹出提示不是很好实现,找到一种提示的办法,请大家给点意见:

private void NewMethod(int i)
{
Debug.Assert(((0< i) && (i < 10)), "i的范围为(1-10)", "调用方法NewMethod时出错");
}

sdfasf3e4awef 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ttiimm11 的回复:]
LZ的是要重新制定一种数据类型吗?
[/Quote]
重新制定一种数据类型,怎么写,能举个例子吗?
ttiimm11 2011-08-25
  • 打赏
  • 举报
回复
LZ的是要重新制定一种数据类型吗?
sdfasf3e4awef 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 icedmilk 的回复:]
Debug.Assert也无法在写代码的时候告诉你错误

编译器就像生产汽车的流水线
你现在的要求就好比告诉流水线:
“哎,那个什么,你给我造一辆只能在北……
[/Quote]

Icedmilk说法相当的幽默,呵呵。
达不到要求,那只能退而求其次了,
现在只能做到Dedug的时候,运行程序的过程中,发现问题了。
jason成都 2011-08-25
  • 打赏
  • 举报
回复
呵呵,没有的。编译只是检查语法问题。这个运行了就不可以了。就像他们说的可以判断一下。但是已经是运行了。判断不符合的话可以抛出应该错误,throw new exception();
threenewbee 2011-08-24
  • 打赏
  • 举报
回复 1
另外给你个建议,就是使用枚举。

enum paramvalue
{
one, two, three, four, five, six, seven, eight, nine, ten
}

void NewMethod(paramvalue value)
{
int x = (int)value;
...
}


threenewbee 2011-08-24
  • 打赏
  • 举报
回复
不可能实现。

你可以在方法内部加上判断。

比如:

int i = Convert.ToInt32(Console.ReadLine());
NewMethod(i);


这个能不能编译呢?

如果成功编译了,那么用户输入 100 呢?
Icedmilk 2011-08-24
  • 打赏
  • 举报
回复

编译时,你都不知道这个函数会接受的参数具体是什么,怎么判断?
happytonice 2011-08-24
  • 打赏
  • 举报
回复
让编译时报错,判断一下,如果超出这个范围,就执行一个不太符合语法或逻辑的语句,就报错了。
sdl2005lyx 2011-08-24
  • 打赏
  • 举报
回复
是的,楼主,你这是对运行时的限制!编译器主要对此法、语法进行处理!

你完全可以在函数里对参数进行判断啊,这也是通常的做法,如果你用过MFC,就会发现微软的底层代码经常用Assert()来判断参数的有效性,net目前我还不知用那个函数,你的函数:

private void NewMethod(int i)
{
if(i<=1 || i>=10)
{
MessageBox.Show("数值超出范围!");
return;
}
}

xiongxyt2 2011-08-24
  • 打赏
  • 举报
回复
在方法体内判断,传入的参数不符合要求时就return
hhddzz 2011-08-24
  • 打赏
  • 举报
回复
没有
凑字
我姓区不姓区 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 sshoub 的回复:]

调用该方法时,如为 NewMethod(12),编译时报错。
[/Quote]

这已经是运行时了……怎么会是“编译时报错”……

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧