【问题标题】:Error on returning Generic Type (No implicit Conversion)返回泛型类型时出错(无隐式转换)
【发布时间】:2023-04-07 22:35:01
【问题描述】:

调用泛型方法时获取隐式转换异常。这样做的正确方法是什么?

这是我的接口和类定义:

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 方法中看到,我将返回不同类型的 Liststring。方法CallGETCG 实现了接口TestData。我能否解释一下为什么会出现此错误以及如何改进此代码,请记住我需要从TestClass 返回stringsList

【问题讨论】:

  • List&lt;TestData&gt; 没有实现where T : TestData 约束
  • 放弃从方法返回完全不同类型的想法怎么样?你已经定义了这个约束where T: TestData,你说你想返回一个字符串。字符串是否实现/继承TestData
  • @Alexander 字符串不能实现测试数据,但我需要知道如何执行此操作,因为这是一项要求。
  • 好吧,string 没有实现这种类型,不可能让string 这样做,你的要求就是这样做,对吧?

标签: c# implicit-conversion


【解决方案1】:

这里的问题是您在T 上定义了一个约束,它必须实现TestData 接口,但是您将T 声明为List&lt;TestData&gt;

编译器告诉您List&lt;T&gt; 没有实现TestData 接口,并且没有可以用来实现这一目标的隐式转换。

解决方案是要么删除约束,要么传入实现TestData 接口的类实例。

【讨论】:

  • var test = TestClass.Call&lt;TestData&gt;("ProjName", "Audio");
  • 但是您发布的代码中有太多未知对象,无法给出正确的解决方案。比如我们在Call方法里面看不到test的定义,在GETCG方法里面也看不到nodees或者templateFields的定义,怎么会@987654334如果没有为string -&gt; TestType定义转换,@工作?
  • 我想这应该可行,我现在不在办公桌前,将进行测试并尽快回复您。
  • 我回到办公桌后肯定会提供更多信息或更新我的问题。谢谢
  • 在我更改为var test = TestClass.Call&lt;TestData&gt;("ProjName", "Audio"); 后,这似乎很好,但现在return (T) Convert.ChangeType(templateFields, typeof(T), CultureInfo.InvariantCulture); 出现错误。错误说:Object must implement ICONVERTIBLE
猜你喜欢
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2013-11-15
  • 2015-05-20
相关资源
最近更新 更多