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

返回泛型类型时出错(没有隐式转换)

  •  -1
  • user726720  · 技术社区  · 6 年前

    下面是我的接口和类定义:

    public interface TestData
    {
        string field { get; set; }
        string fieldName { get; set; }
        string type { get; set; }
    }
    
    public class TestClass
    {
        public static T Call<T>(string Project, string type) where T : TestData
        {
            var returning = GETCG<T>(test, type);
    
            return (T)Convert.ChangeType(returning, typeof(T), CultureInfo.InvariantCulture);
        }
    
        private static T GETCG<T>(string test, string type) where T : TestData
        {
            var fields = nodees.Cast<XmlNode>().Select(x => new
            {
                // some data
            }).ToList();
    
            if (fields != null)
            {
                return (T) Convert.ChangeType(templateFields, typeof(T), 
                    CultureInfo.InvariantCulture);
            }
            else
            {
                return (T)Convert.ChangeType("SomeString", typeof(T), 
                    CultureInfo.InvariantCulture);
            }
        }
    }
    

    我得到了以下异常:

    类型“System.Collections.Generic.List”不能用作泛型类型或方法“TestClass.Call(string,string)”中的类型参数“T”。没有从“System.Collections.Generic.List”到“Test.TestData”的隐式引用转换

    var test = TestClass.Call<List<TestData>>("ProjName", "Audio");
    

    如果你看到 GETCG 方法我返回不同类型 List string Call 实现接口 TestData . 我能解释一下为什么会出现这个错误,以及如何改进代码,同时记住我需要返回 strings 列表 TestClass

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rufus L    6 年前

    这里的问题是您定义了 T 它必须执行 TestData 接口,不管您如何声明 T型 作为一个 List<TestData> .

    List<T> 不执行 测试数据

    解决方案是移除约束或传入实现 接口。