代码之家  ›  专栏  ›  技术社区  ›  FutureCake

无法从源类型强制转换为目标类型C#

  •  1
  • FutureCake  · 技术社区  · 7 年前

    我有以下函数应该能够返回一个泛型值。像这样:

    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());
    

    因为我使用了一个通用方法,所以我需要提供一个在开始时应该返回的类型。(当时我不知道)。因为我的泛型函数将找到要返回的正确类型。所以我只是用了一个像 <int> 但当我运行函数时,会得到以下错误:

    无法从源类型强制转换为目标类型

    我认为这与我用 <国际标准化组织; . 但我不能用 System.Object 因为这在数学运算中无效。如何使函数始终返回正确的类型?

    我知道这可能有点含糊,但这是我第一次用C语言处理泛型。所以如果有什么不清楚,请告诉我,以便我可以澄清!

    2 回复  |  直到 7 年前
        1
  •  0
  •   Vishnu    7 年前

    因为你真的不知道这里的类型,也许我们可以使用动态类型来实现这一点。 类似的东西

    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));
            }
    
        2
  •  0
  •   Erik Philips Gabriel Costa    7 年前

    我不确定是什么 ObjectTypes 是,特别是当它已经存在于.NET中时 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);          
          }
        }
    }
    

    DotNetFiddle Example

    输出

    二十点一

    字符串