[英]Indexer explicit implemented IFormattable
我為自己編寫了一個索引器,它可以工作,但是一旦我顯式實現“ IFormatable”,它就不再起作用。
為什么它不起作用以及如何顯式使用它?
這是我嘗試的:
/// <summary>
/// Example of Coordinates for 3 dimensions.
/// </summary>
public class Coordinates:IFormattable
{
#region Constructor
public Coordinates(int x, int y, int z)
{
_x = x;
_y = y;
_z = z;
_length = 3;
}
#endregion
#region IFormattable implemented
/// <summary>
/// Formating custom string
/// </summary>
/// <param name="format">Format("A"-all value,...,"H"-)</param>
/// <param name="formatProvider">Different culture</param>
/// <returns></returns>
public string IFormattable.ToString(string format, IFormatProvider formatProvider)
{
if (format==null)
{
return ToString(); //Fallbasck
}
else
{
switch (format.ToUpper())//gross, kleinschreibung egal
{
case "A": return ToString();
case "X": return _x.ToString();
case "Y": return _y.ToString();
case "Z": return _z.ToString();
case "H": return String.Format("{0:h}", ToString());
default:
throw new FormatException(String.Format("Format {0} is not defined.", format));
}
}
}
public string ToString(string format)
{
return ToString(format, null); //Error occurs here
}
#endregion
#region overWriteToString
/// <summary>
/// will be called implicit
/// </summary>
/// <returns>[x,y,z]</returns>
public override string ToString()
{
return String.Format("[{0},{1},{2}]",_x,_y,_z);
}
#endregion
#region Properties
private int _x;
public int X
{
get { return _x; }
set { _x = value; }
}
private int _y;
public int Y
{
get { return _y; }
set { _y = value; }
}
private int _z;
public int Z
{
get { return _z; }
set { _z = value; }
}
private int _length;
public int Length
{
get { return _length; }
}
#endregion
#region Indexer
/// <summary>
/// My own indexer for x,y,z
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public int this[int val]
{
get
{
switch (val)
{
case 0: return _x; ;
case 1: return _y; ;
case 2: return _z; ;
default:
throw new IndexOutOfRangeException("Indexer not avaiable.");
}
}
//kann auch setter haben
}
#endregion
}
我正在詳細學習C#。
錯誤發生在這里:
public string ToString(string format)
{
return ToString(format, null); //Error occurs here
}
通過顯式實現ToString(string format, IFormatProvider formatProvider)
,您只能通過編譯時類型為IFormattable
的引用來調用它。
您可以使用this
:
return ((IFormattable)this).ToString(format, null);
要么:
IFormattable formattable = this;
return formattable.ToString(format, null);
我可能會在代碼中添加注釋,以解釋為什么要進行強制轉換,因為直到您注意到該方法顯式實現了IFormattable.ToString
才知道這IFormattable.ToString
。
順便說一句,您是否有任何理由要明確實現它? 感覺應該可以訪問-您應該使用傳入的IFormatProvider
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.