【问题标题】:Problem with Extension Methods and Generic Constraints扩展方法和通用约束的问题
【发布时间】:2011-04-29 12:31:45
【问题描述】:

我有一个基本接口和几个继承的接口。基接口有一些扩展方法可以修改对象并返回基类的新实例(IChildA.Touch() => IBaseIBase.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();
  }
}

【问题讨论】:

    标签: c# .net generics c#-3.0 extension-methods


    【解决方案1】:

    我不知道您的具体用例,但如果您删除非泛型方法并将泛型方法限制为 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多