Думаю, я понимаю, почему это небольшое консольное приложение С# не компилируется:
using System;
namespace ConsoleApp1
{
class Program
{
static void WriteFullName(Type t)
{
Console.WriteLine(t.FullName);
}
static void Main(string[] args)
{
WriteFullName(System.Text.Encoding);
}
}
}
Компилятор вызывает ошибку CS0119: 'Encoding' is a type which is not valid in the given context
. Я знаю, что я могу создать объект Type из его имени с помощью оператора typeof()
:
...
static void Main(string[] args)
{
WriteFullName(typeof(System.Text.Encoding));
}
...
И все работает так, как ожидалось.
Но для меня такое использование typeof()
всегда казалось несколько избыточным. Если компилятор знает, что какой-то токен является ссылкой на данный тип (как предлагает ошибка CS0119), и он знает, что назначение какого-либо присвоения (будь то параметр функции, переменная или что-то еще) ожидает ссылки на данный тип, почему не может ли компилятор воспринимать его как неявный вызов typeof()
?
Или, может быть, компилятор вполне способен принять этот шаг, но он был выбран не из-за проблем, которые могут возникнуть. Это приведет к каким-либо вопросам двусмысленности/разборчивости, о которых я не могу сейчас думать?