2016-07-25 9 views
1

Ich habe einen Code, in dem ich eine Variable "var" deklarieren muss, da sich der Typ basierend auf der Anfrage ändert. Diese Erklärung muss in einem Try-Block hergestellt werden, um alle Ausnahmen zu fangen:Implizit typisierte lokale Variablen müssen initialisiert werden: Bereichsdefinition

try 
{ 
    var calc = (Type1)obj; 
    var results = calc.Function(); 
} 
catch 
{ 
    var calc = (Type2)obj; 
    var results = calc.Function(); 
} 
finally 
{ 
    return results; 
} 

Das Problem ist jetzt, „Ergebnisse“ wird nicht funktionieren, da der Umfang außerhalb try catch-Block endet. Es gibt keine Möglichkeit, var außerhalb des Versuchs zu deklarieren, da ich auf Typecasting prüfen und den Typ entsprechend ändern muss.

Typ1, Typ2 sind verschiedene Schnittstellen und obj ist wieder "var", die verschiedene Typen haben können.

Ich kann nicht var außerhalb try Block als Null initiieren. Wie kann ich das herausfinden?

+1

Wenn Sie einen 'var' als' null' initialisiert, was Typ würdest du erwarten, dass es ist? 'var' ist nicht dasselbe wie' object' noch 'dynamic'. Sie sollten wirklich die Dokumentation zu 'var' lesen, Sie sind weit davon entfernt, es zu verstehen. –

+0

Ich weiß, ich versuche nicht, es als null zu initialisieren. Das ist nicht meine Hauptsorge. Ich suche nur nach den "Ergebnissen", die entweder ein Dataset oder eine Datentabelle sein können, je nachdem, ob der try-Block ausgeführt oder catch-Block ausgeführt wird. – user5820237

+1

'var' kann Ihren Code verschleiern, missbrauchen Sie ihn nicht. Es macht oft Ihren Code viel lesbarer und verständlicher, wenn Sie die Typen erwähnen, umso mehr, wenn Sie Rückgabetypen von Methoden verwenden. –

Antwort

1

haben zwei Umkehrpunkt statt eines:

var results = //determine the result type here 
try 
{ 
    var calc = (Type1)obj; 
    return calc.Function(); 
} 
catch 
{ 
    var calc = (Type2)obj; 
    return calc.Function(); 
} 

auch

Sie sollten überprüfen, ob obj vom Typ Typ1 ist die Besetzung, bevor Sie versuchen Ausnahmen zu vermeiden. So:

if (obj is Type1) 
{ 
    return (obj as Type1).Function(); 
} 
else 
{ 
    return (obj as Type2).Function(); 
} 

Außerdem , da Sie einen Rückgabetyp haben muss, dass die beiden Rückgabetypen entsprechen müssen Sie möglicherweise dies tun könnte (aber dies wird nicht empfohlen):

var result = //type of return type 
    try 
{ 
    var calc = (Type1)obj; 
    result = calc.Function(); 
} 
catch 
{ 
    var calc = (Type2)obj; 
    result = calc.Function(); 
} 
finally 
{ 
return result; 
} 
+0

Ergebnisse können eine Datentabelle oder ein Datensatz basierend auf dem Aufruf sein. – user5820237

+0

In beiden Fällen muss Ihr Rückgabetyp beide enthalten (der Rückgabetyp muss kontravariant zu den beiden möglichen Ergebnissen sein) – barakcaf

+0

Vielen Dank für Ihre Hilfe. Ich werde mit deinen Vorschlägen fortfahren. – user5820237

0

Der beste Weg von einer Clean-Code-Perspektive ist es, eine gemeinsame Schnittstelle zu definieren:

interface IFoo 
{ 
    MyType Function(); 
} 

Jetzt eröffnen Sie bitte ein für den Typ wechseln haben und result aus Ihrem try/catch leicht definieren kann der finally Griff es angemessen zu lassen:

MyType result = null; 
try 
{ 
    IFoo foo = obj as IFoo; 
    results = foo.Function(); 
} 
catch 
{ 
    ... 
} 
finally 
{ 
    return results; 
}