我目前正在重写自定义RPC机制的一部分(不能被其他东西替换,所以不建议;-)).调用的参数收集在内部使用字典的自定义集合中.有一种方法T Get
可以检索命名参数.对于可选参数,我想添加一个TryGet
返回参数的方法,或者null
如果它不存在,那么调用代码可以使用null合并运算符提供默认值.当然,对于值类型,这不起作用,但我可以使用T?
,这是我想要的.
所以我拥有的是:
public class Arguments { // lots of other code here public T TryGet(string argumentName) where T : class { // look up and return value or null if not found } public T? TryGet (string argumentName) where T : struct { // look up and return value or null if not found } }
有了这个,我希望能够做到以下几点:
return new SomeObject( args.TryGet("Name") ?? "NoName", args.TryGet ("Index") ?? 1 );
由于约束是互斥的,编译器应该能够生成正确的代码(始终可以从调用站点给出的泛型类型推断出调用).编译器抱怨该类型已经定义了一个名为"TryGet"的成员,该成员具有相同的参数类型.
有没有办法让这样的工作没有给这两种方法不同的名字?
约束不是签名的一部分.因此,你的问题的答案是否定的.
.NET Framework中的类处理此方案的方式是TryGetValue
使用out
参数.返回值是get是否成功的指示符,其中out
参数包含请求的值(成功时)或合适的默认值(失败时).
这种模式使得实现对于引用和值类型非常简单.您只需要一种方法来处理这两种情况.
有关此模式的示例,请参阅Dictionary
.