我想知道属性中'value'关键字的类型。
这样:
public class Test
{
string _numberAsString;
int _number = -1;
public Test() {}
public string NumberAsString
{
get { return _numberAsString; }
set { _numberAsString= value; }
}
public int Number
{
get { return int.Parse(_numberAsString); }
set { _number = value; }
}
}
//elsewhere
Test t = new Test();
t.Number = 5;
现在,正如我所料,这不会编译。 'value'的类型由属性的返回类型决定,这是正确的吗?我找不到任何相关的东西,也许它太明显了(我没有读过语言规范,大概是那里有东西)。
我问,因为我想用一个类型设置属性,然后将其转换为getter的类型。我想这并没有多大意义。
似乎我必须通过创建几种方法来实现这一目标。
答案 0 :(得分:2)
是的,'value'的类型由属性的返回类型决定。你到底想要完成什么?您是否希望能够将Number或NumberAsString设置为有效值并从任一属性中取回结果?
如果是这种情况,你需要做这样的事情:
public class Test
{
string _numberAsString;
int _number = -1;
public Test() {}
public string NumberAsString
{
get { return _numberAsString; }
set { _numberAsString= value; }
}
public int Number
{
get { return int.Parse(_numberAsString); }
set { _numberAsString = value.ToString(); }
}
}
这将允许您这样做:
Test t = new Test();
t.Number = 5;
Console.WriteLine(t.NumberAsString); // should print out "5"
t.NumberAsString = "5";
Console.WriteLine(t.Number); // should print out "5"
对于采用不同类型的属性,您不能拥有get和set。您唯一的选择是将其作为一种类型存储在内部,然后在get或set(或两者)中执行从一种类型到另一种类型的转换。
答案 1 :(得分:2)
setter中值的类型是属性的类型 - 您不能将字符串传递给int属性,必须先将其解析为int。
.net中的字符串不能被强制转换为任何其他类型(以perl,awk和许多其他动态语言允许的方式)它们只能被视为字符串或其父类对象。
你可以做下面的事情:
private int _number;
private string _numberAsString;
public string NumberAsString
{
get { return _numberAsString; }
set { LinkedSet(value); }
}
public int Number
{
get { return _number; }
set { LinkedSet(value); }
}
private void LinkedSet(string s)
{
this._number = int.Parse(s);
this._numberAsString = s;
}
private void LinkedSet(int i)
{
this._numberAsString = i.ToString();
this._number = i;
}
很明显,NumberAsString setter可以抛出Number setter所不能的FormatException。
我不建议这样做,除非你真的需要避免将数字转换为字符串并将字符串定期转换为数字(此时你可以让setter懒惰在他们对链接值的评估中 - 尽管将异常的语义从字符串集合更改为在int的get上 - 可能最好是烦人或最坏的恶意。
答案 2 :(得分:0)
对我来说,在NumberAsString上允许一个setter是没有意义的。
为什么不呢?:
public class Test
{
int _number = -1;
public Test() {}
public string NumberAsString
{
get { return _number.ToString(); }
}
public int Number
{
get { return _number; }
set { _number= value; }
}
}
答案 3 :(得分:0)
为什么不做呢
Test t = new Test();
t.Number = 5;
Console.WriteLine(t.Number.ToString());
令我感到震惊的是,你没有真正的理由想要狡猾。
我认为当一个方法更合适时,你试图在这里使用一个属性。一个属性不应该有任何不可预见的副作用,这可以通过对它进行类型转换(如果可能的话)。