Думаю, я понимаю, почему это небольшое консольное приложение С# не компилируется:
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()?
Или, может быть, компилятор вполне способен принять этот шаг, но он был выбран не из-за проблем, которые могут возникнуть. Это приведет к каким-либо вопросам двусмысленности/разборчивости, о которых я не могу сейчас думать?