Подтвердить что ты не робот

Как глобальная функция существует в С#?

Как глобальная функция существует в С#, когда все определено внутри класса? Я читал документацию OpCodes.Call в MSDN и был удивлен, увидев следующие формулировки,

Токен метаданных содержит достаточную информацию, чтобы определить, является ли вызов статическим методом, методом экземпляра, виртуальным методом, или глобальной функцией.

Глобальная функция? Он существует в С#? (Это определенно не относится к методу static, поскольку он явно указан вместе с глобальной функцией).

4b9b3361

Ответ 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()

Итак, чтобы ответить на ваш вопрос, нет прямого способа генерировать токен метаданных в последнем методе для С#. Мне пришлось создать последнее в С++.