2015-10-13 61 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

相关问题