Frage

Ich hatte den Eindruck, dass der C # Compiler wird implizit ein Array geben Sie eine Art Basis aus, dass sie alle implizit konvertiert werden können.

Der Compiler erzeugt No beste Art für implizit typisierte Array gefunden

public interface ISomething {}

public interface ISomething2 {}

public interface ISomething3 {}

public class Foo : ISomething { }
public class Bar : ISomething, ISomething2 { }
public class Car : ISomething, ISomething3 { }

void Main()
{
    var obj1 = new Foo();
    var obj2 = new Bar();
    var obj3 = new Car();

    var objects= new [] { obj1, obj2, obj3 };
}

Ich weiß, dass die Art und Weise, dies zu korrigieren ist, die Art wie zu deklarieren:

new ISomething [] { obj1, ...} 

Aber ich bin nach einem unter der Decke Typ Hilfe hier.

War es hilfreich?

Lösung

Der C # Compiler hält den Satz von Typen aller angegebenen Elemente. Es tut nicht betrachten gemeinsame Basistypen etc.

Sie könnte Besetzung einer der Ausdrücke:

var objects= new [] { obj1, obj2, (ISomething) obj3 };

... aber ich persönlich würde nur die explizite Form verwenden:

var objects= new ISomething[] { obj1, obj2, obj3 };

Alternativ, wenn Sie explizit eine oder all obj1, obj2 und obj3 als Typ ISomething erklärt, das würde auch funktionieren, ohne das Array Initialisierungsausdruck zu ändern.

Von dem C # 3 spec, Abschnitt 7.5.10.4:

Ein Array Schöpfung Ausdruck des dritte Form wird als eine bezeichnet implizit typisierte Array-Erstellung Ausdruck . Es ist ähnlich wie die zweite Form, mit der Ausnahme, dass das Element Art der Anordnung ist nicht explizit gegeben, aber als die beste bestimmt allgemeinste Art (§7.4.2.13) des Satzes von Ausdrücke in der Feldinitialisierung.

Abschnitt 7.4.2.13 sieht wie folgt aus:

In einigen Fällen eine häufige Art muss wird für eine Reihe von Ausdrücken zu entnehmen. Insbesondere die Elementtypen implizit typisierte Arrays und die Rückkehr Arten von anonymen Funktionen mit Blockkörper werden auf diese Weise gefunden. Intuitiv, da eine Reihe von Ausdrücke E1 ... Em diese Folgerung soll dem Aufruf eines äquivalent sein Verfahren

Tr M<X>(X x1 … X xm)

mit dem Ei als Argumente. Mehr Gerade beginnt die Folgerung aus mit einem nicht fixierten Typ Variable X. Ausgangs Typinferenz werden dann gemacht von jedem Ei mit Typ X. Schließlich X ist festgelegt und die sich ergebende Form S ist die sich ergebende gemeinsame Typ für die Ausdrücke.

Andere Tipps

Wenn die Instanzen können alle auf die Art der beliebigen Instanz gegossen werden, als diese Art verwendet werden. Es ist nicht genug für alle Instanzen jede Art gemeinsam zu haben, oder aber die implicity Feldinitialisierung würde immer erfolgreich und oft unerwünschte new object[] Arrays erzeugen.

Als leichte Neben den Skeet Antwort:

Sie können entweder eines der Array-Elemente werfen den Typen Sie brauchen (Schnittstelle in diesem Fall) oder wenn Sie nur ein einzelnes Element dieses Typs haben (nicht abgeleitet, sondern von einer direkten Art). Wie

public static IWindsorInstaller[] MobileRestComponentInstallers
        {
            get
            {
                return new []
                           {
                                 new RepositoryInstaller(),
                                 new AppSettingsInstaller(),
                                 // tens of other installers...
                                 GetLoggerInstaller() // public IWindsorInstaller GetLoggerInstaller()...
                           };
            }
        }

Dies funktioniert, aber pls nicht tun :) einfach den Array-Typen definieren und die new[] zu new IWindsorinstaller[] ändern. Es ist viel besser lesbar den Array-Typ explizit definiert ist.

Do like this for Class object( UIViewController) initialization in var array:



 var page1 = new Class1();
 var page2 = new Class2();
 var pages = new UIViewController[] { page1, page2 };

Hinweis: hier können UIViewController eine beliebige Klasse

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top