2014-04-10 15 views
16

Bu çok sık rastlanan bir sorundur ve pek çok geçici çözüm vardır, ancak aslında neler olup bittiğini ve neden çalışmadığını anlamak istiyorum.
Bu yüzden bir test solüsyonu içerisinde 3 meclisleri var, ilk montaj Classa yazın sahiptir: İlk takımınıAçık döküm işleci "derleme başvurulan" hatasıyla başarısız oluyor

public class ClassA 
{ 
    public string Name { get; set; } 
} 

İkinci montaj referansları vardır ve ClassB:

yazmak için döküm için açık bir operatör var
public class ClassB 
{ 
    public string Name { get; set; } 

    public static explicit operator ClassA(ClassB objB) 
    { 
     return new ClassA 
     { 
      Name = objB.Name 
     }; 
    } 
} 

A sınıfı. Bir nedenle miras kullanamayacağımızı ve sadece bir türünü diğerine dönüştürmenin uygun bir yolu olarak döküm kullanamayacağımızı varsayalım.

Şimdi son montaj referanslar ikinci montaj (! Olmayan ilk) ve sahip ClassC yazın: ClassB aynı nedenden dolayı açık dökme operatörünü kullanan

public class ClassC 
{ 
    public string Name { get; set; } 

    public static explicit operator ClassB(ClassC objC) 
    { 
     return new ClassB 
     { 
      Name = objC.Name 
     }; 
    } 
} 

. Şimdi

ilginç kısmı

: Böyle, benim kodunda ClassB için ClassC yayın yapmayı denerseniz:

ClassC objC = new ClassC(); 
ClassB objB = (ClassB)objC; 

aşağıdaki hatayı alıyorum:

Error 1 The type 'FirstAssembly.ClassA' is defined in an assembly that is not referenced. You must add a reference to assembly 'FirstAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

kolayca yeni yaratabilir ClassB örneğidir ve onu ClassC örneğindeki değerlerle başlatır (örneğin, açık cast operatörünün içinde yaptığım gibi) ve iyi çalışır. Peki buradaki sorun nedir? C# Dili Şartnamenin

bölümünde
+0

Eğer bunu kendiniz yaparsanız, ne yapacağınızı biliyorsunuz; ancak dökümcüyü kullanırsanız, derleyiciye, ClassA hakkında bilmesi gereken dökümanın kurallarına göre davranmasını söylersiniz. – TaW

+0

Ama neden? ClassA'ya hiçbir yere gitmiyorum. Oyunun bu kurallarının ayrıntılı olarak açıklandığı bir kaynak belge var mı? –

+0

İlginç bir soru! Bunu kendi başıma test ettim ve * ClassB' * örneğinin yaratılmasının başarısız olacağını çünkü çalışma zamanının ClassB'nin açık oyuncu kadrosunu değerlendiremediğini umuyordum. Şaşırtıcı şekilde çalıştı! Sanırım bir şekilde statik üyelerin bağlanmasıyla ilgili. – Carsten

cevap

2

, 6.4.5 Kullanıcı tanımlı açık dönüşümler (versiyon 4.0) okur: Bu tanımlamıyor

A user-defined explicit conversion from type S to type T is processed as follows:

• Determine the types S0 and T0. If S or T are nullable types, S0 and T0 are their underlying types, otherwise S0 and T0 are equal to S and T respectively.

• Find the set of types, D, from which user-defined conversion operators will be considered. This set consists of S0 (if S0 is a class or struct), the base classes of S0 (if S0 is a class), T0 (if T0 is a class or struct), and the base classes of T0 (if T0 is a class).

derleyici "kümesini bulun nasıltürleri" ama sonraki adım için adaylar arayan tüm ilgili sınıfları arar düşünüyorum:

• Find the set of applicable user-defined and lifted conversion operators, U. This set consists of the user-defined and lifted implicit or explicit conversion operators declared by the classes or structs in D that convert from a type encompassing or encompassed by S to a type encompassing or encompassed by T. If U is empty, the conversion is undefined and a compile-time error occurs.

Bu ClassA başvurusunu çözmeye çalışmanız neden olur.

+1

Bu mimari: türüne bakın, meta veriler ayrıştırılır ve üyeler kullanımınız için açığa çıkar. Oyuncular bu üyelerden biridir. ClassA hakkındaki meta veri bilgilerinin ayrıştırılması yapılırken, ClassA'nın meta verileri mevcut değildir, ne çekirdek kitaplıklarda ne de derlemelerde zaten başvuruyorsunuz. – Andrew

+0

Cevabınız bir süreliğine ortadan kayboldu, şimdi döndüğüne sevindim, bu yüzden kabul edebildim. –

İlgili konular