c# - 返回泛型类型时出错(无隐式转换)
问题描述
调用泛型方法时获取隐式转换异常。这样做的正确方法是什么?
这是我的接口和类定义:
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
和GETCG
实现接口TestData
。我能否解释一下为什么会出现此错误以及如何改进此代码,请记住我需要strings
同时List
返回TestClass
解决方案
这里的问题是您已经定义了一个T
必须实现TestData
接口的约束,但是您将其声明T
为List<TestData>
.
编译器告诉您List<T>
没有实现该TestData
接口,并且没有可以用来实现该接口的隐式转换。
解决方案是删除约束或传入实现TestData
接口的类实例。
推荐阅读
- ios - 如何在我的返回方法上更改可观察类型
- docker - 'docker-compose up' 作为不同的用户而不重新创建容器
- amazon-web-services - API Gateway 不会将 Authorization 标头传递给 Lambda
- git - 如何配置 git 以忽略文件更改但仍将其恢复?
- ssl - keytool error: java.lang.Exception: Public keys in reply and keystore don't match errors when importing crt
- regex - 如何解析文本块并根据该块中的另一个值获取一个值
- database - CouchDB 永久认证密钥
- python - 返回一个值或将一个值分配给一个变量,然后返回 - 最佳实践?
- typescript - 为什么 Typescript 告诉我 X 型是与 ITSELF 不同的子类型?
- github - Github 渲染 Asciidoc 标注:缺少图标