簡體   English   中英

C#內部getter,帶有內部類參數的受保護setter

[英]C# internal getter, protected setter with an internal class parameter

我有一個問題,想要一個屬性有一個內部getter和一個受保護的setter,如本問題所述 ,我想我通過執行以下操作解決了這個問題

public class Accessor : AccessorBase
{
    private Connection _connection;

    protected void setConnection(Connection value)
    {
        _connection = value;
    }

    internal Connection GetConnection()
    {
        return _connection;
    }
    ...
}

但是,我現在收到此錯誤:

可訪問性不一致:參數類型“連接”比方法“setConnection(連接)”更難訪問

這是因為我有internal class Connection 我寧願不讓Connection成為公共類,而Accessor 需要公開,那么如何在保持內部getter和受保護的setter的同時解決這個錯誤呢?

遺憾的是,C#不支持“內部 受保護”訪問修飾符(僅支持“內部 受保護”),這意味着任何 protected成員在程序集外部都可見,並且不能使用內部類型。
使用 internal而不是 protected將是最合理的解決方案。

\n

您可以 在Microsoft Connect上投票,以便有一天可能會將其添加到C#中。

更新:從C#7.2起,您可以使用private protected

創建內部Connection對象實現的公共接口IConnection GetConnectionSetConnection方法接受並返回IConnection而不是Connection

基本的SOLID原則再次獲勝。

...任何受保護的成員在程序集外部都可見,並且不能使用內部類型。

- Pent Ploompuu的回答

解決這個問題的一種方法是在將所有實例方法和構造函數設置為內部時使Connection公開。

如果Connection類是內部的,則派生Accessor的類將無法調用受保護的setConnection,因為它無權訪問Connection。

如果要保護setConnection,則Connection必須是公共的。

抱歉,如果您需要精確設置,則需要公開Connection類。

不可思議的是,你做不到這一點。 由於Connection是內部的,從另一個程序集從Accessor派生的某個類將無法看到Connection ,即使您將setter標記為protected internal也不會解決任何問題。

您唯一的希望是將類Connection公之於眾。

Coincoin是正確的Accessor是一個公共類,任何人都可以從中獲得,這也意味着來自不同的程序集。 該派生類現在具有需要傳遞內部(來自另一個程序集)類的受保護方法。 這永遠不會奏效。

您需要將Accessor內部或Connection公開,或者更好地遵循Randolphos的答案

這是問題的代碼示例

大會1

//this class is only visible in Assembly 1
internal class Connection
{

}
public class Accessor
{
   protected void SetConnection(Connection con) { }
}

第2組 - 參考第1組

//possible because Accessor is public
DerivedAccessor : Accessor
{
   void SomeMethod()
    {
        this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM