[c#] 為什麼不能將匿名方法分配給var?



Answers

只有Eric Lippert知道,但我認為這是因為委託類型的簽名不能唯一確定類型。

考慮你的例子:

var comparer = delegate(string value) { return value != "0"; };

這裡有兩個可能的推斷什麼var應該是:

Predicate<string> comparer  = delegate(string value) { return value != "0"; };  // okay
Func<string, bool> comparer = delegate(string value) { return value != "0"; };  // also okay

編譯器應該推斷哪一個? 沒有理由選擇其中一個。 儘管Predicate<T>在功能上等同於Func<T, bool> ,但它們在.NET類型系統的層次上仍然是不同的類型。 因此,編譯器無法明確地解析委託類型,並且必須使類型推斷失敗。

Question

我有以下代碼:

Func<string, bool> comparer = delegate(string value) {
    return value != "0";
};

但是,以下內容不能編譯:

var comparer = delegate(string value) {
    return value != "0";
};

為什麼編譯器不知道它是一個Func<string, bool> ? 它接受一個字符串參數,並返回一個布爾值。 相反,它給了我錯誤:

無法將匿名方法分配給隱式類型的本地變量。

我有一個猜測,那就是如果編譯了var版本 ,如果我有以下內容,它將缺乏一致性:

var comparer = delegate(string arg1, string arg2, string arg3, string arg4, string arg5) {
    return false;
};

因為Func <>只允許最多4個參數(在.NET 3.5中,我正在使用這個參數),所以上面的內容是沒有意義的。 也許有人可以澄清這個問題。 謝謝。




不同的代表被認為是不同的類型。 例如, ActionMethodInvoker不同,並且Action的實例不能分配給MethodInvoker類型的變量。

因此,給定匿名代理(或lambda)like () => {} ,它是一個Action還是一個MethodInvoker ? 編譯器不知道。

同樣,如果我聲明一個採用string參數並返回bool的委託類型,編譯器如何知道您真的需要一個Func<string, bool>而不是我的委託類型? 它不能推斷委託類型。




這是怎麼回事?

var item = new
    {
        toolisn = 100,
        LangId = "ENG",
        toolPath = (Func<int, string, string>) delegate(int toolisn, string LangId)
        {
              var path = "/Content/Tool_" + toolisn + "_" + LangId + "/story.html";
              return File.Exists(Server.MapPath(path)) ? "<a style=\"vertical-align:super\" href=\"" + path + "\" target=\"_blank\">execute example</a> " : "";
        }
};

string result = item.toolPath(item.toolisn, item.LangId);



Links