我有一个基接口和几个继承的接口。基接口有一些扩展方法,可以修改对象并返回基类的新实例(IChildA.Touch() => IBase
、IBase.Touch() => IBase
)。
对于一个继承路径(IChildB
和子代),我想实现一些扩展方法,这些方法返回一个与调用对象(IGrandChildB.Touch() => IGrandChild
)类型相同的对象。为此,我想指定一个被约束为IChildB
后代的通用扩展方法。
到目前为止,这是有效的,但是现在编译器不能解析来自IChildA
的调用。它尝试使用IChildB
路径的扩展方法,但失败了,而不是使用IBase
接口的扩展方法。有没有一种优雅的方法来解决这个问题?
public interface IBase {}
public interface IChildA : IBase {}
public interface IChildB : IBase {}
public static class BaseExtensions
{
public static IBase Touch(this IBase self) { return self; }
public static T Touch<T>(this T self) where T : IChildB { return self; }
}
public static class TestClass
{
public static void Test()
{
IChildA a = null;
IBase firstTry = a.Touch(); //Cannot resolve to BaseExtensions.DoSomething(this IBase obj)
IBase secondTry = ((IBase)a).Touch(); //Resolves to BaseExtensions.DoSomething(this IBase obj)
IChildB b = null;
IChildB touchedB = b.Touch();
}
}
发布于 2011-03-23 09:46:18
我不知道您的具体用例,但是如果您删除非泛型方法,而是将泛型方法约束为IBase,那么示例仍然可以编译。
public interface IBase {}
public interface IChildA : IBase {}
public interface IChildB : IBase {}
public static class BaseExtensions
{
public static T Touch<T>(this T self) where T : IBase { return self; }
}
public static class TestClass
{
public static void Test()
{
IChildA a = null;
IBase firstTry = a.Touch();
IChildB b = null;
IChildB touchedB = b.Touch();
}
}
https://stackoverflow.com/questions/4003117
复制