无法从源类型转换为目标类型 C#
Cannot cast from source type to destination type C#
我有以下函数应该能够 return 一个通用值。像这样:
T ReturnValueMatchedType<T>(ObjectTypes t, ReturnValues v)
{
if(t == ObjectTypes.int_type)
return (T) Convert.ChangeType(v.IntValue, typeof(int));
else if(t == ObjectTypes.float_type)
return (T) Convert.ChangeType(v.FloatValue, typeof(float));
else if(t == ObjectTypes.string_type)
return (T) Convert.ChangeType(v.StringValue, typeof(string));
else if(t == ObjectTypes.char_type)
return (T) Convert.ChangeType(v.CharValue, typeof(string));
else
return (T) Convert.ChangeType(null, typeof(System.Object));
}
我在数学公式中使用了这个函数。像这样:
VarDetectorA.DetectedVariable.GetVariableValue().IntValue - ReturnValueMatchedType<int>(VarDetectorB.DetectedVariable.GetVariableType(), VarDetectorB.DetectedVariable.GetVariableValue());
因为我使用的是通用方法,所以我需要在开头提供它应该 return 的类型。 (我当时不知道)。因为我的泛型函数会找到 return 的正确类型。所以我只是使用了一个像 <int>
这样的占位符但是当我 运行 这个函数时我得到以下错误:
Cannot cast from source type to destination type
我认为这与我使用 <int>
调用该方法有关。但是我不能使用 System.Object
因为这在数学运算中是无效的。如何使我的函数始终 return 为正确的类型。
我知道这可能有点含糊,但这是我第一次在 C# 中使用泛型。所以,如果有什么不清楚的地方,请告诉我,以便我澄清!
因为你真的不知道这里的类型,也许我们可以使用动态类型来实现这一点。
像
dynamic ReturnValueMatchedType(ObjectTypes t, ReturnValues v)
{
if (t == ObjectTypes.int_type)
return Convert.ChangeType(v.IntValue, typeof(int));
else if (t == ObjectTypes.float_type)
return Convert.ChangeType(v.FloatValue, typeof(float));
else if (t == ObjectTypes.string_type)
return Convert.ChangeType(v.StringValue, typeof(string));
else if (t == ObjectTypes.char_type)
return Convert.ChangeType(v.CharValue, typeof(string));
else
return Convert.ChangeType(null, typeof(System.Object));
}
我不确定 ObjectTypes
是什么,尤其是当它已经作为 enum TypeCode.
存在于 .Net 中时
我怀疑你想要的是:
using System;
public class Program
{
public static void Main()
{
var rv = new ReturnValues
{
Boolean = true,
Double = 20.1,
String = "myString"
};
Console.WriteLine(ReturnValueMatchedType<bool>(rv));
Console.WriteLine(ReturnValueMatchedType<Double>(rv));
Console.WriteLine(ReturnValueMatchedType<string>(rv));
}
public class ReturnValues
{
public bool Boolean { get; set; }
public Double Double { get; set; }
public string String { get; set; }
}
public static T ReturnValueMatchedType<T>(ReturnValues v)
{
var typeCode = Type.GetTypeCode(typeof(T));
switch( typeCode )
{
case TypeCode.Boolean:
return (T)(object)v.Boolean;
case TypeCode.Double:
return (T)(object)v.Double;
case TypeCode.String:
return (T)(object)v.String;
default:
return default(T);
}
}
}
输出
True
20.1
myString
我有以下函数应该能够 return 一个通用值。像这样:
T ReturnValueMatchedType<T>(ObjectTypes t, ReturnValues v)
{
if(t == ObjectTypes.int_type)
return (T) Convert.ChangeType(v.IntValue, typeof(int));
else if(t == ObjectTypes.float_type)
return (T) Convert.ChangeType(v.FloatValue, typeof(float));
else if(t == ObjectTypes.string_type)
return (T) Convert.ChangeType(v.StringValue, typeof(string));
else if(t == ObjectTypes.char_type)
return (T) Convert.ChangeType(v.CharValue, typeof(string));
else
return (T) Convert.ChangeType(null, typeof(System.Object));
}
我在数学公式中使用了这个函数。像这样:
VarDetectorA.DetectedVariable.GetVariableValue().IntValue - ReturnValueMatchedType<int>(VarDetectorB.DetectedVariable.GetVariableType(), VarDetectorB.DetectedVariable.GetVariableValue());
因为我使用的是通用方法,所以我需要在开头提供它应该 return 的类型。 (我当时不知道)。因为我的泛型函数会找到 return 的正确类型。所以我只是使用了一个像 <int>
这样的占位符但是当我 运行 这个函数时我得到以下错误:
Cannot cast from source type to destination type
我认为这与我使用 <int>
调用该方法有关。但是我不能使用 System.Object
因为这在数学运算中是无效的。如何使我的函数始终 return 为正确的类型。
我知道这可能有点含糊,但这是我第一次在 C# 中使用泛型。所以,如果有什么不清楚的地方,请告诉我,以便我澄清!
因为你真的不知道这里的类型,也许我们可以使用动态类型来实现这一点。 像
dynamic ReturnValueMatchedType(ObjectTypes t, ReturnValues v)
{
if (t == ObjectTypes.int_type)
return Convert.ChangeType(v.IntValue, typeof(int));
else if (t == ObjectTypes.float_type)
return Convert.ChangeType(v.FloatValue, typeof(float));
else if (t == ObjectTypes.string_type)
return Convert.ChangeType(v.StringValue, typeof(string));
else if (t == ObjectTypes.char_type)
return Convert.ChangeType(v.CharValue, typeof(string));
else
return Convert.ChangeType(null, typeof(System.Object));
}
我不确定 ObjectTypes
是什么,尤其是当它已经作为 enum TypeCode.
我怀疑你想要的是:
using System;
public class Program
{
public static void Main()
{
var rv = new ReturnValues
{
Boolean = true,
Double = 20.1,
String = "myString"
};
Console.WriteLine(ReturnValueMatchedType<bool>(rv));
Console.WriteLine(ReturnValueMatchedType<Double>(rv));
Console.WriteLine(ReturnValueMatchedType<string>(rv));
}
public class ReturnValues
{
public bool Boolean { get; set; }
public Double Double { get; set; }
public string String { get; set; }
}
public static T ReturnValueMatchedType<T>(ReturnValues v)
{
var typeCode = Type.GetTypeCode(typeof(T));
switch( typeCode )
{
case TypeCode.Boolean:
return (T)(object)v.Boolean;
case TypeCode.Double:
return (T)(object)v.Double;
case TypeCode.String:
return (T)(object)v.String;
default:
return default(T);
}
}
}
输出
True
20.1
myString