C #: причина ложного сообщения для InvalidCastException - PullRequest
4 голосов
/ 11 апреля 2011

Этот конкретный вопрос больше связан с попыткой увидеть причину сообщения компилятора, чем с решением проблемы, но я надеюсь, что все в порядке.

Допустим, у нас есть:

class Foo {
    public static explicit operator Foo(Bar bar) {
        return new Foo();
    }
}

РеализацияBar не важно.Теперь, когда вы пытаетесь сделать следующее, возникает исключение:

object obj = new Bar();
Foo foo = (Foo)obj;

Это дает InvalidCastException, и это правильно, потому что у нас нет оператора приведения типа object.Но сообщение об исключении:

System.InvalidCastException: Невозможно привести объект типа 'Bar' к типу 'Foo'

. может привести объект типа Bar к типу Foo.Я ожидаю, что компилятор скажет мне, что я в основном пытаюсь привести объект типа System.Object, а не Bar.Является ли мое понимание ошибочным, и если да, то в чем причина этого поведения?

Заранее спасибо

РЕДАКТИРОВАТЬ: Просто чтобы быть ясно, я знаю , как решить проблемуи это Foo foo = (Foo)(Bar)bar сделает свое дело.Меня больше интересует само сообщение об ошибке.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Ну, что еще может сказать сообщение?

Если бы он сказал " Невозможно привести объект типа 'объект' к типу 'Foo' ", это было бы обманчиво и менее полезно, потому что obj не является экземпляром object, и у вас не будет никакого способа узнать, что obj является экземпляром.

Другой альтернативой было бы что-то вроде " Невозможно привести объект типа 'Bar' (упоминаемый как 'объект') к типу" Foo "", но это многословно и немного сбивает с толку , Возможно, это можно было бы сформулировать лучше, но оно все еще многословно - кроме того, вы можете быстро найти ту же информацию, просто взглянув на исходный код.

Когда вы думаете об этом, сообщение действительно (даже если оно не рассказывает всю историю) - возможно разыграть с Bar до Foo, но в данном конкретном случае CLR не смог выполнить этот акт.

0 голосов
/ 11 апреля 2011

Это в вашем коде:

public static explicit operator Foo(Bar bar) {

Это может сработать, если станет:

public static implicit operator Foo(Bar bar) {

Или вы можете написать:

Foo foo = (Foo)(Bar)bar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...