2013-11-06 4 views
1

Я попытался преобразовать переменную Object в StreamWriter. Но это не работает. Какая ошибка?System.InvalidCastException: невозможно лить объект типа «System.Object» для ввода «System.IO.StreamWriter»

StreamWriter file = (StreamWriter) myObject; 
+3

Ну это a 'System.Object' - это не' System.IO.StreamWriter'. Откуда вы его взяли, и почему вы * ожидаете, что сможете передать его в StreamWriter? –

+0

myObject на самом деле является переменной SSIS, которая была получена с использованием кода 'Object myObject = Dts.Variables [" yourStreamWriterHere "]. Значение;' Опять же, не беспокойтесь об этом. Давайте посмотрим на C#. – Steam

+0

@JonSkeet - Мой ответ приведен ниже. – Steam

ответ

2

Другой момент моей глупости. Я прокомментировал строку, которая делает это: Object myObject = Dts.Variables ["yourStreamWriterHere"]. Итак, внутри myObject ничего не было. Есть ли там нуль? В Java это так. Кроме того, java дает вам прекрасное исключение nullPointerException. Но, визуальная студия дает вам загадочную «Micro $ lop ™: Невозможно найти причину ошибки. Свяжитесь с Billy для получения дополнительной информации. Держите вашу кредитную карту удобной на всякий случай. Время ожидания центра обработки звонков варьируется». Просто раздражает.

Во всяком случае, реальная ошибка, которую вы получаете -

Error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidCastException: Unable to cast object of type 'System.Object' to type 'System.IO.StreamWriter'. 
    at ST_ffrrefr939322939392dfr.csproj.ScriptMain.Main() 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 
    at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() 
+0

Да, это будет пустой, если вы его не назначили. Вы не получаете исключение NullReferenceException, потому что не происходит дефрагментация. – Rik

+0

@blasto: да, тогда он угрюм содержит нуль, а когда вы вызываете какую-либо функцию на нем, бросает null refrence. Исключение –

+0

@blast. На C# объекты, которые являются «нулями», действительно имеют тип; Вы можете использовать 'null' для любого типа, который вы хотите. Например, вы можете передать значение null в качестве параметра метода, пока нулевой, который вы передаете, имеет тот же тип, что и указанный параметр метода. –

3

Значение myObject не является (конвертируемая к ним) StreamWriter.

+1

Теперь я внимательно изучил значение слова. Имеет смысл. Мое значение было null. – Steam

3

Попробуйте это:

if (myObject is StreamWriter) 
{ 
    var file = (StreamWriter) myObject as StreamWriter; 
} 
+0

Это работает независимо от того, является ли 'myObject'' null '. Однако в C# существует разница между объектом, который является «null», и объектом, который неинициализирован. Таким образом, вышеописанное работает, если 'myObject' был объявлен и инициализирован через' object myObject = null', но нет, если он только что был объявлен через 'object myObject;' без инициализации. В вашем случае я предполагаю, что 'myObject' является параметром (типа' object') для метода и передается 'StreamWriter'. До тех пор, пока этот «StreamWriter» был инициализирован, даже если «StreamWriter sw = null;», вышеупомянутое будет работать без ошибок. –

1

Перед преобразованием, проверьте, если он может быть приведен к StreamWriter объекта, используя is ключевое слово, как показано ниже:

if(myObject is StreamWriter) 
{ 
//can be cast 
} 
else 
{ 
//can not be cast 
} 
Смежные вопросы