2010-08-04 18 views
12

Oto moja metoda:C# 4.0 Opcjonalne parametry - jak określić opcjonalny parametr typu "Guid"?

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

userId daje mi błąd, jak to musi być stała w czasie kompilacji, które rozumiem. Ale nawet kiedy zadeklarować const:

private const emptyGuid = Guid.Empty; 

następnie zmienić podpis metody do:

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

nadal nie ma miłości.

Czego mi brakuje?

+0

Możliwy duplikat [Jak mogę domyślnie parametr Guid.Empty w C#?] (Https://stackoverflow.com/questions/5117970/how-can-i-default-a-parameter-to-guid-empty-in-c) –

Odpowiedz

20

Czy próbowano ustawienie go do nowej instancji Guid ala:

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

powinno załatwić sprawę.

+0

To wszystko. Twoje zdrowie! – RPM1984

+0

@ RPM1984 Miło to słyszeć! –

+3

Dobrą rzeczą w tym podejściu jest to, że nadal można go przetestować za pomocą Guid.Empty w swoim kodzie. na przykład if (userId == Guid.Empty) {...} –

2

Czy lepszym rozwiązaniem nie byłoby przeciążenie metody wersją, która nie wymaga Guid? To rozwiązałoby problem i moim zdaniem byłoby to lepsze rozwiązanie. Oczywiście, mogą istnieć inne ograniczenia, których nie jestem świadomy, aby wymagać tego projektu.

+0

Cały punkt parametrów opcjonalnych C# 4 ma na celu uniknięcie niepotrzebnego przeciążenia. Mam około 7 parametrów, które filtruję według (w zapytaniu LINQ), po co przeciążać metodę 7 razy tym samym kodem? Sądzę, że to "inne ograniczenia", do których się odnosisz. =) – RPM1984

+1

dla 2 argumentów lepiej jest mieć 2 przeciążone metody niż opcjonalne parametry IMO. Głównie do projektowania, takich jak mySuperObject.Add (ref one, ref two, ref three, ref four, ref five) vs mySuperObject.Add(); –

2

może to pomoże (za pomocą operatora ?? i Guid typu pustych)

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

cześć, jeśli spróbuję tego, otrzymam komunikat (z grubsza przetłumaczony): Wartość parametru "" nie może być używana jako parametr standardowy, ponieważ nie ma standardowej konwersji na "System.Guid" – Offler

Powiązane problemy