2015-10-13 60 views
4

我想Fullname到包括FirstNameLastname的,但我得到以下異常:我想一個字符串字段,以包括其他兩個領域

一個字段初始不能引用非靜態字段,方法或 財產類字段的「Employee.FirstName」 /「Employee.LastName」

class Employee 
{ 
    public string FirstName { get; } 
    public string LastName { get; } 
    private string FullName = string.Format("{0}, {1}", FirstName, LastName); 
} 
+4

使其屬性 – singsuyash

+0

我設置的值已初始化變量

前OCDing使用'String'類而不是'string'; P –

+1

@YuvalItzchakov我應該使用** string **而不是** String **,但它已經成爲使用java的一種習慣:) – jeroen

回答

9

的分配順序不被運行時保證。這就是編譯器以編譯時錯誤警告你的原因。

如果FullName是公共財產,你能夠做到:

class Employee 
{ 
    public string FirstName { get; } 
    public string LastName { get; } 
    public string FullName => $"{FirstName} {LastName}"; 
} 

對於任何不使用C#-6:

class Employee 
{ 
    public string FirstName { get; private set; } 
    public string LastName { get; private set; } 
    public string FullName 
    { 
     get { return string.Format("{0} {1}", FirstName, LastName); } 
    } 
} 

或者,如果你不希望它是公開的,你需要通過類的構造函數實例化字段

class Employee 
{ 
    public Employee(string firstName, string lastName) 
    { 
     FirstName = firstName; 
     LastName = lastName; 
     fullName = $"{FirstName} {LastName}"; 
    } 

    public string FirstName { get; } 
    public string LastName { get; } 
    private string fullName; 
} 
+3

=>和$「」只適用於C#6 – MikeT

+1

OP是使用自動獲取者屬性(不是'私人設置')。我假設他在使用C#-6。如果需要,他可以自由將其降級到C#-5。 –

+0

@InvisiblePanda不需要'=>'運算符,他可以在類構造函數中設置它,不像以前的C#版本那樣你必須明確地擁有一個私有的setter。 –

1

我想你需要把它放在類的構造函數。錯誤是因爲您正在嘗試使用不存在的值,或者在您使用這些值時可能不會。

2

你想,如果你從一組更改爲得到那麼你將有更多的成功

class Employee{ 
    public String FirstName { get; } 
     public String LastName { get; } 
     public String FullName { 
      get{ 
       return String.Format("{0}, {1}", FirstName, LastName); 
      } 
     } 
    } 
} 
+1

這與@Yuval Itzchakov只使用較舊的c#是一樣的答案,他的答案更完整更完整 – MikeT

相關問題