我在C#中的类型推断中发现了一些奇怪的东西。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'
如果我写as
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()'并得到异常。编译器*信任你当你做类型转换'(T)(IInterface1)',但运行时不会 –
ASh