重载属性设置器

Cam*_*ron 7 c#

我在看这个问题,这让我很奇怪.

每当我定义一个具有自动属性的类时,

// Example A
public class MyObject
{
  public int MyInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

JIT编译器将它转换为类似于:

// Example B
public class MyObject
{
  private int _MyInt;

  public int get_MyInt()
  { 
    return _MyInt;
  }

  public void set_MyInt(int value)
  {
    _MyInt = value;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以假设写下如下内容:

// Example C.1
public class MyObject 
{
  public int MyInt { get; set; }

  public void set_MyInt(string value)
  {
    MyInt = int.Parse(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

或者像这样的东西:

// Example C.2
public class MyObject 
{
  private int _myInt;
  public int MyInt 
  {
    get { return _myInt; }
    set 
    { 
      _myInt = value; 
    }
    set(string) 
    { 
      _myInt = int.Parse(value); 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并且此功能存在且没有编译器错误.

// Example D
public void DoSomething(string someIntegerAsAString)
{
  var myObject = new MyObject()
  {
    MyInt = someIntegerAsAString
  };
}
Run Code Online (Sandbox Code Playgroud)

什么阻止编译器说出示例D之类的代码,其中推断出所需的结果并且它正常工作并且预期?功能就在那里,如例B所示.

这是否与语言设计者如何设计语言的工作和行为有关?

And*_*ena 2

你确实可以这样做...

public class MyObject 
{
  public int MyInt { get; set; }

  public void set_MyInt(string value)
  {
    MyInt = int.Parse(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

...尽管将字符串转换为 int 会产生明显的性能开销。

这是行不通的:

public class MyObject 
{
  private int _myInt;
  public int MyInt 
  {
    get { return _myInt; }
    set 
    { 
      _myInt = value; 
    }
    set(string) 
    { 
      _myInt = int.Parse(value); 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

...因为 C# 不支持setter重载。但是,您可以通过隐式类型转换实现类似的效果,但它必须在您自己的类型上实现。整数是一种值类型,因此它本质上是密封的。

  • @Cameron:我意识到我参加聚会已经很晚了,但作为 Eric Lippert 博客的常客(曾经在 C# 编译器上工作),我认为 C# 编译器不允许重载设置器的最可能的解释是:只是没有被认为是有用或足够重要的语言功能。正如埃里克(Eric)总是指出的那样,实现一项功能是有成本的,所以除非一个功能不是非常需要,否则它不会存在。 (2认同)