簡體   English   中英

為什么類沒有靜態或常量屬性以及同名的實例屬性?

[英]Why can a class not have a static or constant property and an instance property of the same name?

直到現在我才真正質疑過這個問題。 我有一個包含許多字段的輸入模型,我想通過輸入模型顯示屬性的字符串名稱,以便我的網格可以使用它們:

public class SomeGridRow
{
    public string Code { get;set; }
    public string Description { get;set; }

    public const string Code = "Code";
}

顯然,這給出了錯誤:

'SomeGridRow'類型已經包含'Code'的定義

為什么CLR無法應對兩個同名的屬性,在我看來,這兩個屬性是分開的?

string code = gridRow.Code;          // Actual member from instantiated class
string codeField = SomeGridRow.Code; // Static/Const

我現在只是在我的輸入中使用一個名為Fields的子類,所以我可以使用SomeGridRow.Fields.Code 這有點亂,但它確實有效。

因為您也可以以相同的方式(在同一個類中)訪問靜態(或者在這種情況下為非實例)屬性,並且它會有點混亂,例如:

public class SomeGridRow
{
  public string Code { get;set; }
  public const string Code = "Code";
  public void MyMethod() {
    var thing = Code; //what would this reference?
  }
}

因為這兩個:

public class SomeGridRow
{
  public string Code { get;set; }
  public void MyMethod() {
    var thing = Code; //what would this reference?
  }
}

還有這個:

public class SomeGridRow
{
  public const string Code = "Code";
  public void MyMethod() {
    var thing = Code; //what would this reference?
  }
}

是訪問屬性的有效方法,靜態與否。 它沒有回答“為什么我不能?” 問題,但更多的是為什么它不被允許......這將是太模糊的IMO。

它可能會,但C#的設計者希望避免可能來自語言特征的這種使用(濫用?)的歧義。

這樣的代碼最終會讓用戶感到困惑和模糊(我想要實例或靜態方法調用嗎?哪一個是對的?)。

除了已經提出的關於模糊性的觀點之外,我想說在這種情況下需要重新命名命名。

如果兩個變量/字段在同一個上下文中具有完全相同的名稱,即類但對我來說不同的值聽起來更像是命名問題。

如果它們完全相同,則不需要2個字段。

如果它們略有不同,您應該有更准確的名稱。

在具有類似語法的一些其他語言中,可以通過實例訪問靜態成員。 所以你可以訪問string.Empty"abc".Empty

C#不允許這樣做(盡管它確實來自類或派生類,因為你可以省略靜態成員的類名,並且可以省略實例成員的this ),主要是為了避免混淆(我發現它比混亂更方便tbh,但那只是我,我喜歡切換掉落,所以我知道什么)。

在引入更嚴格的規則以減少歧義之后,在其背后允許更寬松的規則允許更多,這將適得其反。 想想多少個“為什么我必須使用this財產X,但沒有財產Y'” 問題所以才會有,如果它是允許的(我們不得不迫使this財產X是明確的,我們指的實例成員)。

暫無
暫無

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

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