Как глобальная функция существует в С#?
Как глобальная функция существует в С#, когда все определено внутри класса? Я читал документацию OpCodes.Call в MSDN и был удивлен, увидев следующие формулировки,
Токен метаданных содержит достаточную информацию, чтобы определить, является ли вызов статическим методом, методом экземпляра, виртуальным методом, или глобальной функцией.
Глобальная функция? Он существует в С#? (Это определенно не относится к методу static
, поскольку он явно указан вместе с глобальной функцией).
Ответы
Ответ 1
Вы не можете иметь глобальные функции в С#, это просто не часть языка. Вы должны использовать статический метод для выбранного вами класса, чтобы получить аналогичную функциональность.
Однако С# не является единственным языком, использующим CLR. Можно написать Managed С++, который может иметь глобальные функции.
Ответ 2
На конференции Build 2014 было объявлено, что из Roslyn вперед вы можете импортировать статические методы из типов с помощью директивы using TypeName;
, чтобы вместо использования System.Math.Min(...)
вы могли:
using System.Math;
...
var z = Min(x,y);
Примечание: к моменту выпуска это стало:
using static System.Math;
Ответ 3
Потому что System.Reflection.Emit.OpCodes.Call
не о С#. Это об испускании кодов ОП. В IL есть функции, недоступные на С#. Глобальные функции - одна из этих функций.
Ответ 4
Я полагаю, что дело в том, что это операция инъекции IL, но IL не является абсолютно только о С#. Другими словами, он поддерживает язык, поддерживающий глобальные функции.
Ответ 5
Документация, на которую вы ссылаетесь, предназначена для .net. С# не обслуживает глобальные функции, но .net делает.
Ответ 6
С# не поддерживает все функции MSIL. Глобальные функции - один из них. VB.Net, F #, IronPython или какой-либо другой язык, чтобы использовать эту и другие функции, которые не сгенерированы компилятором С#.
Ответ 7
Я просто перезаписываю свой предыдущий ответ...
Вот что каждый выглядит в IL DASM с соответствующими кодами:
// Static Method
IL_0001: call void testapp.Form1::Test()
// Instance Method
IL_0001: call instance void testapp.Form1::Test()
// Virtual Method
IL_0001: callvirt instance void testapp.Form1::Test()
// Global Function
IL_0000: call void testapp.Test()
Итак, чтобы ответить на ваш вопрос, нет прямого способа генерировать токен метаданных в последнем методе для С#. Мне пришлось создать последнее в С++.