J'écris une classe VectorN générique personnalisée, où T: struct, IFormattable, IComparable, IConvertible. Je peux accéder à une valeur indexée de vecteur par cet [index int]. Donc, dans une boucle que je fais ce morceau de code pour faire VectorN.One:Transmettre de la structure int personnalisée à la structure C#
r[i] = (T)Convert.ChangeType(1, typeof(T));
Il fonctionne parfaitement avec des nombres standards tels que int, décimal, etc., mais quand je l'ai écrit un uHalfByte struct personnalisé pour les tests, il donne une erreur:
Invalid cast from 'System.Int32' to 'uHalfByte'.
Voici le script de uHalfByte:
struct uHalfByte : IFormattable, IComparable<uHalfByte>, IConvertible
{
private byte val;
public byte Val
{
get { return (byte)(val & 0xF); }
set { val = (byte)(value & 0xF); }
}
public uHalfByte(byte val)
{
this.val = (byte)(val & 0xF);
}
public string ToString(string format, IFormatProvider formatProvider)
{
if (formatProvider == null) formatProvider = System.Globalization.CultureInfo.CurrentCulture;
if (string.IsNullOrEmpty(format)) format = "G";
string s = "";
for (int i = 0; i < 4; i++) s += ((Val >> i) & 1).ToString(format,formatProvider);
return s;
}
public int CompareTo(uHalfByte other)
{
return this.Val - other.Val;
}
public TypeCode GetTypeCode()
{
return TypeCode.Byte;
}
public bool ToBoolean(IFormatProvider provider)
{
return val!=0;
}
public char ToChar(IFormatProvider provider)
{
return (char)val;
}
public sbyte ToSByte(IFormatProvider provider)
{
return (sbyte)val;
}
public byte ToByte(IFormatProvider provider)
{
return (byte)val;
}
public short ToInt16(IFormatProvider provider)
{
return (short)val;
}
public ushort ToUInt16(IFormatProvider provider)
{
return (ushort)val;
}
public int ToInt32(IFormatProvider provider)
{
return (int)val;
}
public uint ToUInt32(IFormatProvider provider)
{
return (uint)val;
}
public long ToInt64(IFormatProvider provider)
{
return (long)val;
}
public ulong ToUInt64(IFormatProvider provider)
{
return (ulong)val;
}
public float ToSingle(IFormatProvider provider)
{
return (float)val;
}
public double ToDouble(IFormatProvider provider)
{
return (double)val;
}
public decimal ToDecimal(IFormatProvider provider)
{
return (decimal)val;
}
public DateTime ToDateTime(IFormatProvider provider)
{
return new DateTime(val);
}
public string ToString(IFormatProvider provider)
{
return ToString("", provider);
}
public object ToType(Type conversionType, IFormatProvider provider)
{
return Convert.ChangeType(val, conversionType);
}
public static explicit operator uHalfByte(int val)
{
return new uHalfByte((byte)val);
}
}
Ai-je fait quelque chose de mal dans uHalfByte ou il est tout simplement impossible?
Cependant, il n'y a pas de possibilité de mettre en œuvre un constructeur dans une interface struct et aucune option pour utiliser une classe abstraite comme base de struct. Comment devrait ressembler IMyConvertibleExample? – mcmikecreations