Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何强制参数[CallerLineNumber]为只读?_C#_.net - Fatal编程技术网

C# 如何强制参数[CallerLineNumber]为只读?

C# 如何强制参数[CallerLineNumber]为只读?,c#,.net,C#,.net,[CallerLineNumber]是一个很好的语言特性。但我正在用它来帮助你。但是,当用户使用此参数调用函数或构造函数时,用户能够向其提供值,这完全超出了自动生成的目的。目前,我必须将此参数命名为\u doNotSet,以提示调用者不要设置此参数 我怎样才能强制它是只读的,或者更好,从函数签名中隐藏它 我的另一个想法是将参数标记为[ocated],这样使用它编译器就会发出警告。不幸的是,obsoletateAttribute不是参数的目标,因此我无法将参数标记为参数。我很惊讶编译器没有重写调用

[CallerLineNumber]
是一个很好的语言特性。但我正在用它来帮助你。但是,当用户使用此参数调用函数或构造函数时,用户能够向其提供值,这完全超出了自动生成的目的。目前,我必须将此参数命名为
\u doNotSet
,以提示调用者不要设置此参数

我怎样才能强制它是只读的,或者更好,从函数签名中隐藏它


我的另一个想法是将参数标记为
[ocated]
,这样使用它编译器就会发出警告。不幸的是,
obsoletateAttribute
不是参数的目标,因此我无法将参数标记为参数。

我很惊讶编译器没有重写调用函数传入的值。无论如何,接受这种不幸的行为,我不认为你能做任何事情来保证没有人会破坏它

据我所知,最接近你的是你所做的。将其命名为
\u doNotSet
,但我建议使用
\u设置此breaks工具。根据代码的受众,这可能足以满足您的需求

编辑:这显示了如何确定是否提供了值,不幸的是,这里提供的策略都不适用于您。基本上,他们建议使用一个已知的不太可能的值(在您的情况下是不可能的,因为您不知道行号或者您不在乎)。或者不要使用默认值并重载函数。但是
[CallerLineNumber]
属性需要参数是可选的才能工作。混蛋

来吧,微软。。。为什么

这将介绍.Net如何实现可选参数的默认值。当您在函数上指定一个参数是可选的,并在没有值的情况下调用该函数时,编译过程中会发生一些非常特殊的事情。没有该参数值的代码将替换为具有默认值的代码

我读了几篇关于这方面的博文,这是最简单的理解基础

我可能在这里做了一些跳跃,但我的猜测是
[CallerLineNumber]
属性向编译器发出信号,要求使用不同的值,即行号但是编译器甚至不会执行注入值的过程,因为首先有一个值


Microsoft可能希望
[CallerLineNumber]
覆盖传递到函数中的值,但附带默认值的副作用可能导致它们无法支持该功能。我很想看看这个项目是否为该功能带来了一些增强。

您可以创建一个像
ICallerLineNumberPlaceholder
这样的界面

public Task<TResult> ExecuteWithArgs<TResult, TParam>(Func<IDBLambdaEngine, TResult> queryExpression, TParam param, ICallerLineNumberPlaceholder placeholder = default, [CallerLineNumber] int callerLineNumber = 0) where TResult : new()
{
    return InternalExecute<TResult, TParam>(callerLineNumber, param);
}
public Task ExecuteWithArgs(Func queryExpression,TParam参数,ICallerLineNumberPlaceholder=default,[CallerLineNumber]int CallerLineNumber=0),其中TResult:new()
{
返回InternalExecute(callerLineNumber,参数);
}

如果它实际上与“用户”相关,这可能是一个问题,但实际上,这一微小的问题只与潜在的编码者相关,文档注释不会处理任何事情。这依赖于编译器对可选参数的支持,这是让编译器生成值的一个困难要求。没有可能的语法让您满意,也不缺少///选项来教育用户。