簡體   English   中英

如何選擇從泛型方法調用的正確的 c# 重載擴展方法

[英]How to pick the correct c# overloaded extension method called from a generic method

我正在努力獲得通用方法中調用的正確擴展方法。

我想這是編譯時方法選擇的限制,但在 C# 中是否有巧妙的方法來解決這個問題?

[TestClass]
public class WrongOverloadSelection 
{
    [TestMethod]
    public void WorksNew()
    {
        new Generic<A>().Test();
    }

    [TestMethod]
    public void FailsGeneric()
    {
        PicksWrongOverload<A>();
    }

    public void PicksWrongOverload<T>()
    {
        new Generic<T>().Test();
    }
}

public class A{}
public class Generic<T>{}

public static class Extensions
{
    public static void Test(this Generic<A> source) { }

    public static void Test<T>(this Generic<T> source) 
    {
        throw new Exception("Not this one!");
    }
}

嘗試這個:

// Now it picks then right one
public static void PicksWrongOverload<T>()
{
    Extensions.Test((dynamic)new Generic<T>());
}

原因在此處解釋,但本質上在運行時 CLR 會將動態類型轉換為例程所需的類型,如果沒有發生任何違反類型檢查規則的事情,那么您就可以開始了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM