我在看这个问题,这让我很奇怪.
每当我定义一个具有自动属性的类时,
// 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所示.
这是否与语言设计者如何设计语言的工作和行为有关?
你确实可以这样做...
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重载。但是,您可以通过隐式类型转换实现类似的效果,但它必须在您自己的类型上实现。整数是一种值类型,因此它本质上是密封的。