2010-08-04 38 views
12

这里是我的方法:C#4.0可选参数 - 如何指定类型“Guid”的可选参数?

public void SomeQuery(string email = "", Guid userId = Guid.Empty) 
{ 
    // do some query 
} 

userId是给我一个错误,因为它必须是一个编译时间常数,这我明白。但是,即使当我宣布一个const:

private const emptyGuid = Guid.Empty; 

那么该方法的签名更改为:

public void SomeQuery(string email = "", Guid userId = emptyGuid) 
{ 
    // do some query 
} 

仍然没有爱。

我在想什么?

+0

的可能重复[我怎样才能默认在C#中的参数Guid.Empty?](https://stackoverflow.com/questions/5117970/how-can-i-default-a-parameter-to-guid -in-in-c) – 2017-11-19 11:49:22

回答

20

您是否尝试过将其设置为Guid ALA的新实例:

public void SomeQuery(string email = "", Guid userId = new Guid()) 
{ 
    // do some query 
} 

应该做的伎俩。

+0

就是这样。干杯! – RPM1984 2010-08-04 00:45:32

+0

@ RPM1984很高兴听到它! – 2010-08-04 00:48:08

+3

这种方法的好处在于,您仍然可以在代码中使用Guid.Empty进行测试。例如 if(userId == Guid.Empty){...} – 2010-08-04 00:51:24

2

难道一个更好的解决方案是重载方法的版本不需要Guid?这将解决这个问题,并且在我看来这将是一个更好的设计。当然,我可能还有其他限制,我不知道需要这种设计。

+0

C#4可选参数的要点是避免不必要的重载。 我有大约7个参数,我正在过滤(在LINQ查询中),为什么重载一个方法7次使用相同的代码?我想这就是你提到的'其他限制'。 =) – RPM1984 2010-08-04 00:46:20

+1

2个参数最好有2个重载方法比可选参数IMO。主要是像mySuperObject.Add(参考一,参考二,参考三,参考四,参考五)与mySuperObject.Add(); – 2010-08-04 01:34:30

2

也许这将有助于(使用运营商??和GUID可空类型)

public void some_method(string name, Guid? guid = null) 
{ 
     _name = name; 
     _guid = guid ?? Guid.NewGuid(); 
} 
+0

嗨,如果我尝试这个我得到一个消息(粗略翻译):类型''kann的值不能用作标准参数,因为没有标准转换为“System.Guid” – Offler 2013-01-17 16:20:58