Возможно, он предназначен для обработки случаев, когда конструктор преобразования разрешает операцию, но, очевидно, IsAssignableFrom также не обрабатывает это. Не вижу ничего, что может справиться с этим. Поэтому я не вижу, как проверять такие случаи:
class Program
{
static void Main(string[] args)
{
B bValue = new B(123);
Console.WriteLine(typeof(A).IsAssignableFrom(bValue.GetType()));
//Console.WriteLine(bValue is A);
//Console.WriteLine(bValue as A == null);
A aValue = bValue;
Console.WriteLine(aValue.ToString());
}
}
class A
{
string value;
public A(string value)
{
this.value = value;
}
public override string ToString()
{
return value;
}
}
class B
{
int value;
public B(int value)
{
this.value = value;
}
public static implicit operator A(B value)
{
return new A(value.value.ToString());
}
}
В конце концов, я не вижу никакой причины, по которой вы не захотите использовать свою версию кода, если только вы не хотите код, выдавший исключение, когда значение obj равно нулю. Это единственное отличие, которое я вижу. obj.GetType () сгенерирует исключение с нулевой ссылкой, когда obj имеет значение NULL, а не сгенерирует указанное исключение.
Редактировать: Теперь я вижу, что ваша версия кода не будет компилироваться, если T может быть типом значения, но другое предлагаемое решение, такое как "if (obj is T) return (T) obj;" скомпилирует. Поэтому я понимаю, почему предложенная вами альтернатива не будет работать, но я не понимаю, почему вы не можете использовать «is».