【发布时间】:2015-04-10 16:25:52
【问题描述】:
我在看this question,这让我感到好奇。
每当我定义一个具有自动属性的类时,
// Example A
public class MyObject
{
public int MyInt { get; set; }
}
JIT 编译器会将其转换为类似于以下内容:
// Example B
public class MyObject
{
private int _MyInt;
public int get_MyInt()
{
return _MyInt;
}
public void set_MyInt(int value)
{
_MyInt = value;
}
}
因此,您可以假设编写如下内容:
// Example C.1
public class MyObject
{
public int MyInt { get; set; }
public void set_MyInt(string value)
{
MyInt = int.Parse(value);
}
}
或者可能是这样的:
// Example C.2
public class MyObject
{
private int _myInt;
public int MyInt
{
get { return _myInt; }
set
{
_myInt = value;
}
set(string)
{
_myInt = int.Parse(value);
}
}
}
并且在没有编译器错误的情况下存在此功能。
// Example D
public void DoSomething(string someIntegerAsAString)
{
var myObject = new MyObject()
{
MyInt = someIntegerAsAString
};
}
是什么阻止了编译器说出诸如 Example D 之类的代码,在这些代码中推断出所需的结果并且它可以正常工作并符合预期? 示例 B 中显示了该功能。
这是否违背了语言设计者设计语言的工作和行为方式?
【问题讨论】:
-
在第一个示例中没有什么能阻止您。编译错误会阻止你。不支持重载的属性设置器。您不妨只使用一种方法。可能还有一些奇特的方式来滥用它,那么为什么要在很少使用的东西上浪费时间、精力和金钱呢?
-
事实上,您可以使用动态绑定 hanselman.com/blog/… 进行方法重载,这对于 auto-IMPLEMENTED 属性是不可能的,但它有时会有所帮助
标签: c#