2015-06-16 25 views
14

Böyle bir sınıf vardır:C# Başvurulan Ad Alanı Gizli By Sınıf Ad Alanı

namespace Token1.Token2.Token3 
{ 
    public class Class1 
    { 
    } 
} 

Ve böyle başka sınıfı:

namespace Token2.Token4.Token5 
{ 
    public class Class1 
    { 
    } 
} 

birinci sınıf Projemin bir parçasıdır, ikinci sınıf Kuruluşumdaki başka bir grup tarafından geliştirilen bir çerçeve kitaplığından. Birinci sınıfın isim alanının ikinci sırada Token2 olduğuna ve ikinci sınıfın ad alanının ilk sırada Token2'ye sahip olduğuna dikkat edin.

Yapmakta olduğum sorun, ad alanı çakışması gibi görünen nedenlerden dolayı, birinci sınıftaki ikinci sınıfa bakamıyorum. Birinci sınıfta bunu denerseniz:

namespace Token1.Token2.Token3 
{ 
    public class Class1 
    { 
     var frameworkClass1 = new Token2.Token4.Token5.Class1(); 
    } 
} 

Visual Studio IDE kırmızı Token4 vurgular ve der "sembolünü 'Token4' çözülemiyor". Eğer faremi 1. sınıfta yeni olduğum yer olan Token2 üzerine getirirsem, intellisense bana "ad alanı Token1.Token2" yi gösterir, böylece proje sınıfımın ad alanını açıkça görüyor ve çerçeve sınıfımın ad alanını göremiyor.

Sınıf kütüphanesinin ad alanını, zaten geçerli olan kod miktarından dolayı değiştirmek çok zor olacaktır. Bunu aşmanın bir yolu var mı? Token2 yana

+2

Sorununuzun çözümü **, bunu yaptığınızda acıyorsa, bunu yapma **. Bir ad alanının üst düzeyinin, başka bir ad alanının ikinci düzeyi ile aynı olduğu, * ad * yapı ad alanlarını kullanmayın. Acıdan başka bir şeye neden olmaz. Bu belirsizlikleri olmayan ad alanlarını oluşturmak için standart yönergeleri izleyin. Şimdi değiştiremeyeceğini söylüyorsun; Size garanti ederim * gelecekte değişmesi daha zor * olacak, bu yüzden şimdi iyi bir zamana benziyor. –

cevap

25

da size "kök" ad aradığınız belirtmek gerekir Token1 bir alt ad alanıdır:

:

var frameworkClass1 = new global::Token2.Token4.Token5.Class1(); 

Bir using ifadesiyle takma bunu da olabilir

using Token5 = global::Token2.Token4.Token5; 

Ve sonra sadece takma referans:

var frameworkClass1 = new Token5.Class1(); 
+0

Biliyorsanız, ** neden ** alt adları olan sınıfları nitelendirmek için yararlı sayılırsa, bu yanıtın iyi bir uzantı olacağını düşünürdüm. (Ya da burada bununla uğraşan başka bir soru var mı?) Java bu soruna sahip değil çünkü her zaman oradaki ya da sınıftaki referansta tam yolları kullanmanız gerekiyor ve bunun bir kısıtlama olduğunu hiç düşünmemiştim. . – Matthias

+0

Neden (veya Java geliştiricisi olmadığım için Java ile karşılaştır) nedenini cevaplayamıyorum - C# dil özelliklerini içeren iyi insanlar ([bölüm 3.8 - Ad alanı ve tür adları] (https://msdn.microsoft) .com/en-us/library/aa691136.aspx)) Açıkça görünen ad alanlarını aramak için bazı faydalar olduğunu açıkça hissettim. –

3

Global :: Token2'yi çerçeve ad alanı için denediniz