作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 C# 的类型推断中发现了一些对我来说很奇怪的东西。
例子。
我有一个界面
interface IInterface1
{
}
和一个实现接口(interface)的类
class Class1 : IInterface1
{
}
然后我有一个创建类的函数
static Class1 GetInstanceOfClass1()
{
return new Class1();
}
我想使用将返回可枚举的通用函数
static IEnumerable<T> GetSomething<T>() where T : IInterface1
{
yield return GetInstanceOfClass1();
}
完整代码为
using System.Collections.Generic;
namespace TypeInference
{
interface IInterface1
{
}
class Class1 : IInterface1
{
}
class Program
{
static Class1 GetInstanceOfClass1()
{
return new Class1();
}
static IEnumerable<T> GetSomething<T>() where T : IInterface1
{
yield return GetInstanceOfClass1();
}
static void Main(string[] args)
{
}
}
}
这段代码没有编译
Cannot implicitly convert type 'TypeInference.Class1' to 'T'
如果我写成
yield return (T)GetInstanceOfClass1();
错误信息如下
Cannot convert type 'TypeInference.Class1' to 'T'
它不能像以前那样转换。
好的。我写成
yield return (IInterface1)GetInstanceOfClass1();
得到了
Cannot implicitly convert type 'TypeInference.IInterface1' to 'T'
它不能像以前那样转换。
但是如果我写成
yield return (T)(IInterface1)GetInstanceOfClass1();
一切正常
有人可以向我解释哪里出了问题以及代码最终被编译的原因吗?
谢谢。
最佳答案
这是为了防止自己搬起石头砸自己的脚。就像你最终设法做到的那样。
如果你定义会发生什么
interface IInterface2 : IInterface1 { }
然后调用GetSomething<IInterface2>()
?这是一个有效的泛型类型参数,但是 Class1
没有实现 IInterface2
.
更糟糕的是,如果你定义会发生什么
class Class2 : IInterface1 { }
然后调用GetSomething<Class2>()
?
您的设计已损坏,您需要多加考虑,不要继续解决编译器错误,直到您有一个真正有机会工作的设计。
关于C# 类型推断、泛型和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32964256/
我是一名优秀的程序员,十分优秀!