无法从源类型转换为目标类型 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);          
      }
    }
}

DotNetFiddle Example

输出

True

20.1

myString