看来我们不能在 C# 泛型类中轻松调用类型转换运算符。这是代码。为什么?
T006 终于归档了我们的目标。
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Reflection;
using System.Linq;
namespace ConsoleApplication1
{
class vec<T, T2> : List<T> where T : class
{
public vec(IEnumerable<T2> other)
{
//Converter<T2, T> cvt = (v) => (T)v; // T004 failed, try defined function dynamicly, cannot compile, too.
// T006 pass, client happy, we not happy, but anyway passed, performance may not happy.
var conversionOperator = typeof(T).GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(m => m.Name == "op_Explicit" || m.Name == "op_Implicit")
.Where(m => m.ReturnType == typeof(T))
.Where(m => m.GetParameters().Length == 1 && m.GetParameters()[0].ParameterType == typeof(T2))
.FirstOrDefault();
Func<T2, T> cvt = (obj) =>
{
if (conversionOperator != null)
return (T)conversionOperator.Invoke(null, new object[] { obj });
else
return default(T);
};
foreach (T2 item in other)
{
//Add((T)item); // T001 failed, this line cannot compile
//Add(item as T); // T002 failed, this line alwasy return null. // http://msdn.microsoft.com/en-us/library/vstudio/cscsdfbt.aspx
//Add((T)(object)item); // T003 failed, pass compile, but throw exception at runtime.
Add(cvt(item)); // T006 pass.
}
}
// T005 pass, but clients for this code will not happy.
public vec(Converter<T2, T> cvt, IEnumerable<T2> other)
{
foreach (T2 item in other)
{
Add(cvt(item));
}
}
}
class XXX
{
public int foo = 22;
static public explicit operator XXX(YYY other)
{
XXX me = new XXX();
me.foo = (int)other.foo;
return me;
}
}
class YYY
{
public float foo = 11;
}
class Program
{
static void Main(string[] args)
{
YYY[] from = new YYY[2];
for (int i = 0; i < from.Length; i++)
{
from[i] = new YYY();
}
XXX x = (XXX)from[0];
vec<XXX, YYY> coll = new vec<XXX, YYY>(from);
// Not happy, this requires user have strong C# skill;
//vec<XXX, YYY> coll = new vec<XXX, YYY>((v) => (XXX)v, from);
foreach (var item in coll)
{
Debug.Print("Value is {0}", item.foo);
}
}
}
}
T001 的编译器错误是:Cannot convert type 'T2' to 'T'