在C#中的类型推断中,我发现了一些奇怪的问题。
下面是一个例子:
我有一个接口
interface IInterface1
{
}
并且实现接口的类
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)
{
}
}
}
这段代码没有被编译
无法隐式将类型 'TypeInference.Class1' 转换为 'T'
如果我这样写:
yield return (T)GetInstanceOfClass1();
错误信息如下:
之前的转换无法继续进行。无法将类型“TypeInference.Class1”转换为“T”
好的,我写成这样。
yield return (IInterface1)GetInstanceOfClass1();
并且得到
无法将类型'TypeInference.IInterface1'隐式转换为'T'
就像之前一样,它无法转换。
但是如果我写成
yield return (T)(IInterface1)GetInstanceOfClass1();
一切都没问题。
有人能解释一下为什么代码最终编译成功了吗?
谢谢。
(T)(IInterface1)GetInstanceOfClass1();
在运行时不会出错。一个人可以创建class NewClass1 : IInterface1
; 调用GetSomething<NewClass1>()
并获得异常。编译器在进行类型转换(T)(IInterface1)
时信任您,但运行时不会这样。 - ASh