Why does this example require "where is T: class"?

Code example:

using System.Collections.Generic;
using FileHelpers;

....
private void Save<T>(string destFilename,  IEnumerable<T> data) where T : class    
{
    var engine = new FileHelperEngine((typeof(T)));


    engine.HeaderText = engine.GetFileHeader(); 
    engine.WriteFile(destFilename, data); // XX
}

On line XX, the second parameter to engine.WriteFile expects an IEnumerable <object>. This code is working fine.

My question is: why is the method limitation "where T: class" required for the method? If I delete it, I get a compile-time error:

Argument 2: cannot convert from
'System.Collections.Generic.IEnumerable<T>' to
'System.Collections.Generic.IEnumerable<object>'

I would have thought that everything was an β€œobject” and that the restriction was not necessary?

+4
source share
2 answers

Constraint is necessary because it objectis a reference type; types of reason values ​​can be assigned objectdue to boxing (although technically all types are inherited from System.Object).

- ; a IEnumerable<T> T IEnumerable<object>, .

FileHelperEngine<T>, - FileHelperEngine (as FileHelperEngine<object>), T : class. , - , , - FileHelperEngine<T> , - , , , :/p >

using System.Collections.Generic;
using FileHelpers;

....
private void Save<T>(string destFilename,  IEnumerable<T> data) where T : class    
{
    var engine = new FileHelperEngine<T>();


    engine.HeaderText = engine.GetFileHeader(); 
    engine.WriteFile(destFilename, data);
}
+6

T FileHelperEngine<T>, , T : class. , , T FileHelperEngine<T>. , .

0

All Articles