2010-04-09 13 views
0

Cela peut vous sembler fou, mais j'ai besoin d'un Nullable<T> (où T est une struct) pour retourner un type différent pour sa propriété Value.Est-il possible de surcharger Value sur une structure nullable, pour renvoyer un type différent?

Règles étant si la propriété de Nullable<T> HasValue est true, la valeur retournera toujours un objet d'un type spécifié différent (puis lui-même).

Je suis peut-être trop penser à cela, mais ce test de l'unité ci-dessous montre ce que je veux faire.

public struct Bob 
    { 
      ... 
    } 


    [TestClass] 
    public class BobTest 
    { 
      [TestMethod] 
      public void Test_Nullable_Bob_Returns_Joe() 
      { 
        Joe joe = null; 
        Bob? bob; 
        var bobHasValue = bob.HasValue; // returns if Bob is null 

        if(bobHasValue) 
          joe = bob.Value; //Bob returns a Joe 
      } 
    } 
+2

Il montre clairement ce que vous voulez faire, mais ... pourquoi? Et comment ton Bob sait-il ce que Joe doit retourner? –

+0

Je voudrais écrire la logique dans la propriété surchargée, ou quoi d'autre. – Andrew

Répondre

3

Vous recherchez un user-defined implicit conversion? Si oui, vous pouvez définir un sur Bob:

class Bob { 
    static public implicit operator Joe(Bob theBob) { 
     // return whatever here... 
    } 
} 

Si vous ne pouvez pas faire cela parce que vous n'avez pas accès à changer Bob, vous pouvez toujours envisager d'écrire une méthode d'extension:

public static class BobExt { 
    public static Joe ToJoe(this Bob theBob) { 
     return whatever; // your logic here... 
    } 
} 

if(bobHasValue) 
    joe = bob.Value.ToJoe(); // Bob converted to a Joe 
+0

Nice one! Vous ne voulez pas un 'implicite 'cependant? – Kobi

+0

@Kobi: Haha. Je dois réduire le café. Oui, merci - j'ai corrigé mon exemple. – LBushkin

+0

Si je me souviens bien, l'opérateur de conversion n'a pas besoin d'être défini dans la classe. –