2011-02-27 184 views
0

在一個命名空間(Ventosa.Graphics)我在另一個項目命名型號公共變量無法訪問

namespace Ventosa.Graphics 
{ 
    public class Model : GraphicsResource 
    { 
     public Model(...) 
     { 
      ... 
     } 
     ... 
    } 
} 

然後一個公共類我試圖訪問這個類

Model player = new Model(...); 

但是這行創建一個錯誤。 C#認識到Model存在,但聲稱由於其保護級別而無法訪問。不應該公開表示它可以從任何地方訪問?

是的,基類GraphicsResource是公共的。

這也發生在我的項目中的其他幾個地方,所有的派生類。

編輯: 確切的錯誤信息是(在德國): 明鏡Zugriff奧夫 「Ventosa.Graphics.Model」 IST aufgrund DER Sicherheitsebene nichtmöglich。翻譯爲英語,它說:由於其防護等級,「Ventosa.Graphics.Model」無法訪問。

+1

你確定它知道你正在談論哪個Model類嗎?你有'使用Ventosa.Graphics;'在正在嘗試使用它的課程中? – 2011-02-27 20:17:05

+1

您確定另一個Model類不存在是否有其他名稱空間?嘗試將其更改爲Ventosa.Graphics.Model player = new Ventosa.Graphics.Model()並參閱... – Chandu 2011-02-27 20:18:12

+0

是的,我已經仔細檢查過,沒有任何歧義,並且是的,我確實有使用聲明。我現在很困惑。 – Hannesh 2011-02-27 20:18:46

回答

2

你描述了一些顯然不應該的東西。我建議你儘可能以最簡單的方式重現問題。你可能無法做到。然後添加到您的示例中,使其越來越像您的生產代碼,直到觸發問題。

刪除對超類GraphicResource的引用。確保只定義了一個構造函數。嘗試使用完全名稱空間引用(而不是using語句)以及該單一的顯式構造函數從相同的名稱空間實例化該類。它可能會工作。

如果它不起作用,退一步,並完全定義一個新類型(Ventosa.Graphics.ModelTest什麼的)。確保工作。

現在,添加件重新。從GraphicResource繼承,請嘗試。刪除命名空間資格;改爲使用using。將實例化移至其他名稱空間,然後移至其他程序集。

您已驗證GraphicResource類的定義是公共的。那麼超類呢?

+0

編譯Model類時,BaseClass的保護級別會出現任何問題。 – 2011-02-27 21:21:04

+0

我接受了你的建議並做了一個新的類型。它工作正常,所以我只是複製代碼並重命名新類。之前沒有工作的原因仍然讓我感到遺憾,但現在我可以繼續我的項目。 – Hannesh 2011-03-01 16:43:28

0

我知道這可能聽起來很愚蠢,但已嘗試重新啓動Visual Studio(清洗和重建解決方案後)?我注意到一些奇怪的行爲,特別是如果啓用了代碼覆蓋率並安裝了一些Visual Studio的Powertools。

在以前的版本中是內部模型嗎?這是一個非常常見的名字。

編輯:一種確保您確實擁有正確類型的方法,您可以將「模型」聲明懸停在第二個項目中並按F12(或右鍵單擊並選擇「轉到定義」,不知道德國術語現在)。這應該帶你到你的類或其他一些「模型」類的定義(也會顯示.NET內部類型)。

+0

是的,模型在以前的版本中是內部的,這很可能是問題。這讓我感到很沮喪,現在我的電腦已經多次重新啓動。 – Hannesh 2011-02-28 16:53:28

+0

您是否嘗試刪除所有編譯器生成的DLL(bin/Debug,bin/Release在所有項目中)?如果您爲單元測試啓用了部署,則可以清除/移除TestResults文件夾。還要刪除.suo文件(位於與.sln相同的目錄中,但必須使用'attrib -h * .suo'才能看到它),其中的信息將在下一個版本中重新生成。 – 2011-02-28 18:21:35